所以,我们有一个MVC项目已经通过不同版本的MVC从1升级到4。
现在我们有一个控制器方法:
public async Task<ActionResult> IndexAsync()
因此,如果我们转到http://somedomain.xyz/WhicheverController
或 http://somedomain.xyz/WhicheverController/Index
,我们会收到404.
http://somedomain.xyz/WhicheverController/IndexAsync
路由到该方法就好了。
我们的路由出了什么问题?
答案 0 :(得分:4)
我相信如果您从AsyncController派生Controller,那么您的示例将会起作用。
public class MyController:AsyncController
{
public async Task<ActionResult> IndexAsync()
{
return View(); //view called "Index.cshtml", not "IndexAsync.cshtml"
}
}
现在,尽管控制器名称中出现~/My/Index
,但您可以在没有Async
后缀的情况下点击Async
。
这是以前的MVC异步控制器方法的遗留物,通常需要IndexComplete
方法才能工作,但是使用基于任务的异步控制器方法,不需要匹配的XxxxComplete
方法,但是观察到Async
惯例。
AsyncController
的实际实现相当稀疏:
public abstract class AsyncController : Controller
{
}
因此,在MVC堆栈的某处,测试控制器的类型,并打开特殊的路由魔法。
答案 1 :(得分:3)
没有将异步操作映射到具有Async
后缀的方法的约定。如果要在操作名称中使用Async
后缀,则必须修改路线。
只需将方法的返回类型更改为async Task<ActionResult>
即可异步执行操作。
Async
后缀只是命名约定。任何MVC框架都不会预期或执行它。
示例强>
以下操作使用默认路由
异步工作public class HomeController : Controller
{
public async Task<ActionResult> Index()
{
await Task.Delay(1000);
ViewBag.Message = "Modify this template to jump-start blah .. blah";
return View();
}
...
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
);
}
}
答案 2 :(得分:0)
路由工作正常,在asp.net mvc 5中你不再需要Async后缀来执行操作,你应该删除它。
只需链接两个异步执行一个作业的操作(操作方法和操作结果),就需要此约定。使用asp.net mvc 5中新的异步模型,您不再需要此Async约定。就像从AsyncController继承一样。