我在异步 ASP.Net MVC 控制器方法方面遇到问题。我有一个控制器,它有一个视图,它返回 HttpGet 到"/home"路由。它可以同步工作正常,但我想测试我的一些数据库功能,所以我将其更改为异步并添加了一些代码以将模型写入我的数据库。
[RoutePrefix("home")]
public class HomeController : AsyncController
{
[HttpGet]
[Route("")]
public async Task<ActionResult> IndexAsync()
{
// DEBUGGING - TEST WRITING USER TO DB
var user = new UserModel(Guid.NewGuid().ToString(), "test", "test", "test@test.com", "tester");
await user.WriteToDatabase();
// DEBUG END
return View("Index");
}
}
如果我删除注释之间的行,则视图返回就可以了,但是,如果我不删除注释之间的行,则会出现以下错误:
System.InvalidOperationException
找不到视图"索引"或其主视图或没有视图引擎 支持搜索的位置。以下位置是 搜索:
~/视图/主页/索引.aspx
~/views/home/index.ascx
~/视图/共享/索引.aspx
~/views/Shared/Index.ascx
~/views/home/index.cshtml
~/views/Home/Index.vbhtml
~/views/Shared/Index.cshtml
~/views/Shared/Index.vbhtml
说明:HTTP 500.处理请求时出错。
详细信息:非 Web 异常。异常来源(应用程序名称或 对象):System.Web.Mvc。
我已经验证了该视图存在于路径"~/Views/Home/Index.cshtml"中,并且由于该页面在同步版本中加载得很好,我知道该视图的语法是正确的。数据库写入操作成功,但由于某种原因找不到视图。
我只是不知道为什么将方法设置为异步会突然导致剃刀视图引擎错误。任何帮助,不胜感激。
提供异步控制器类以向后兼容 ASP.NET MVC 3
尽管执行异步操作,但应将操作的名称保留为Index
而不是IndexAsync
。 这样,您也可以根据当前正在执行的操作执行return View();
。所谓的异步命名约定不适用于操作名称。
您也不应该使用AsynController
而只是让您的控制器从可以处理异步操作的普通Controller
继承。
备注:ASP.NET MVC 4 及更高版本中的控制器类支持异步模式。
[RoutePrefix("home")]
public class HomeController : Controller {
//Matches GET home
[HttpGet]
[Route("")]
public async Task<ActionResult> Index() {
// DEBUGGING - TEST WRITING USER TO DB
var user = new UserModel(Guid.NewGuid().ToString(), "test", "test", "test@test.com", "tester");
await user.WriteToDatabase();
// DEBUG END
return View();
}
}