我用2个控制器,HomeController和OtherController创建了一个空的ASP.NET MVC 3应用程序.
HomeController.cs看起来像这样:
public class HomeController : Controller { public ActionResult Index() { return View(); } }
Index.cshtml看起来像这样:
@Html.Action("Index","Other")
而且,当然,Othercontroller.cs:
public class OtherController : Controller { [ChildActionOnly] public ActionResult Index() { return Content("OK!"); } }
到现在为止还挺好.我运行应用程序,它告诉我一切正常!
现在,我从Global.asax.cs获取默认的RegisterRoutes:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults ); }
我把它弄皱了,所以没有路由匹配OtherController:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("Default","",new { controller = "Home",action = "Index" }); }
System.InvalidOperationException: No route in the route table matches the supplied values. Source Error: Line 1: @Html.Action("Index","Other")
解决方法
我认为这篇博文将帮助您了解更多:
http://blogs.charteris.com/blogs/gopalk/archive/2009/01/20/how-does-asp-net-mvc-work.aspx.
本质上,路由涉及确定哪个控制器“启动”以处理请求以及根据您发送的参数调用适当的操作,MVCRouteHandler使用这些参数做出决定.只是因为你告诉它你的动作中的哪个控制器没有让它神奇地忽略路由表,直接进入那个控制器类并绕过后端发生的所有其他MVC优点.请记住,这些@HTML.Action方法可能会占用大量的重载,这可能会影响路由表中的哪个路由(例如,考虑URL结构).
MVC路径不是静态内容,因此必须通过URLRoutingModule进行解析,URLRoutingModule使用路由表来决定要做什么.由于您没有匹配的路线 – 您会收到错误消息.
编辑
在我的诽谤中,我实际上没有说明你的最后陈述.你是对的,没有生成URL,但是生成了对应用程序的请求. HTML.Action仍将使用路由来确定要使用的控制器,操作,区域和参数.我认为用简单的术语说它就像生成一个ActionLink并为你点击它一样公平.