Jac*_*all 8 asp.net-mvc routes
我已创建了2个控制器的其他空ASP.NET MVC 3应用,HomeController
和OtherController
.
HomeController.cs看起来像这样:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
Index.cshtml看起来像这样:
@Html.Action("Index", "Other")
Run Code Online (Sandbox Code Playgroud)
而且,当然,Othercontroller.cs:
public class OtherController : Controller
{
[ChildActionOnly]
public ActionResult Index()
{
return Content("OK!");
}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我运行应用程序,它告诉我一切都是OK!
现在,我采用RegisterRoutes
Global.asax.cs 的默认值:
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
);
}
Run Code Online (Sandbox Code Playgroud)
我把它弄皱了,所以没有路线匹配OtherController
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "", new { controller = "Home", action = "Index" });
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行该页面时,它会崩溃并显示以下错误消息:
System.InvalidOperationException: No route in the route table matches the supplied values.
Source Error:
Line 1: @Html.Action("Index", "Other")
Run Code Online (Sandbox Code Playgroud)
我在调用中指定了控制器名称和操作名称.Action
.没有生成任何URL,也没有请求.为什么路由甚至需要参与?
我认为这篇博文将帮助您更多地理解:
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 并为您单击它一样。
归档时间: |
|
查看次数: |
4398 次 |
最近记录: |