【问题标题】:ASP.Net Async MVC controller function causes Razor View Engine errorASP.Net Async MVC 控制器功能导致 Razor View Engine 错误
【发布时间】:2018-06-11 17:10:28
【问题描述】:

我遇到了异步 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");
    }
}

如果我删除了 cmets 之间的线,则返回的视图很好,但是,如果我不删除 cmets 之间的线,我会收到以下错误:

System.InvalidOperationException

未找到视图“索引”或其主视图或没有视图引擎 支持搜索的位置。以下位置是 搜索:

~/Views/Home/Index.aspx

~/Views/Home/Index.ascx

~/Views/Shared/Index.aspx

~/Views/Shared/Index.ascx

~/Views/Home/Index.cshtml

~/Views/Home/Index.vbhtml

~/Views/Shared/Index.cshtml

~/Views/Shared/Index.vbhtml

描述:HTTP 500.Error processing request.

详细信息:非网络异常。异常来源(应用程序名称或 对象):System.Web.Mvc。

我已验证视图存在于路径“~/Views/Home/Index.cshtml”中,并且因为页面在同步版本中加载得很好,我知道视图的语法是正确的。数据库写入操作成功,但由于某种原因无法找到视图。

我只是不知道为什么将方法变为异步会突然导致剃刀视图引擎错误。任何帮助表示赞赏。

【问题讨论】:

  • 虽然执行异步操作,但您应该将操作名称保留为 Index 而不是 IndexAsync。这样你也可以在你目前正在做的事情上做return View();。所谓的异步命名约定不适用于动作名称。它会导致您遇到同样的问题。
  • 你也不应该使用AsynController,而只是让你的控制器继承自可以处理异步操作的普通Controller。

标签: c# asp.net .net asp.net-mvc-4 visual-studio-mac


【解决方案1】:

AsyncController Class 提供与 ASP.NET MVC 3 的向后兼容性

虽然执行异步操作,但您应该将操作名称保留为 Index 而不是 IndexAsync。这样你也可以像你目前正在做的那样做return View();。所谓的异步命名约定不适用于动作名称。

你也不应该使用AsynController,而只是让你的控制器继承自可以处理异步操作的普通Controller。

Remarks: ASP.NET MVC 4 及更高版本中的 Controller 类支持异步模式。

[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();
    }
}

【讨论】:

  • 感谢您的回复。我实施了您建议的更改,但不幸的是,我仍然看到相同的错误。我已经验证索引存在于我的目录结构中的正确位置,所以我知道它就在那里我只是不知道为什么它似乎找不到 Index.cshtml 文件。
  • 我最终解决了这个问题,但我不确定实际问题仍然存在。当我遇到问题时,我正在使用 Visual Studio for Mac 在 Macbook Pro 上工作,所以我切换到 Windows 机器,我不再遇到同样的问题,它按预期工作。这似乎只是在 macOS 系统上开发时才会出现的问题。
  • @JakeLeveroni 是的,配置是正确的。我在我的手机上,所以直到现在才看到你的 cmets。
  • @JakeLeveroni 仅用于故障排除。尝试升级到 MVC5,看看你是否在不同的平台上遇到了同样的问题。
  • @JakeLeveroni 我参加聚会有点晚了,但请参阅here - Mono 似乎还不支持 MVC 的 async/await。我发现这个是因为我在 Macbook Pro 上也遇到了同样的问题,但不幸的是没有迹象表明它何时会实施..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2016-11-01
  • 2018-07-15
  • 2011-09-16
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多