Asp.net mvc 了解和配置路由
我有一个MVC应用程序,其中只指定了默认路由,如下所示:Asp.net mvc 了解和配置路由,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我有一个MVC应用程序,其中只指定了默认路由,如下所示: routes.MapRoute( _ "Default", _ "{controller}/{action}/{id}", _ New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ ) 首先,我想理解这个路由的第一个参数中“Defau
routes.MapRoute( _
"Default", _
"{controller}/{action}/{id}", _
New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
)
首先,我想理解这个路由的第一个参数中“Default”一词的含义,以便构建一个可以按照我的意愿工作的路由
通过以下内容,我希望能够调用ApplicationModule控制器的索引,而不必在Url中特别提到索引方法,就像我对其他控制器所做的那样:
href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"
href=“ApplicationModule/Index/”
如果我从这个Url中删除/索引,应用程序会告诉我没有找到所述资源。
我做错了什么?默认值只是路线的名称 您可以设置一条路线来实现这一点,但它可能会破坏站点的其余部分 问题是您希望它自动将URL中的第二个参数视为ID,但它如何知道它是一个ID而不是一个操作方法名称?回答1:“Default”只是一个路由名称,供您内部参考,帮助您描述路由的用途 回答2:在默认映射之前添加此映射
routes.MapRoute( _
"ApplicationModuleIndex", _
"ApplicationModule/{id}", _
New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParameter.Optional} _
)
这可能会产生副作用,url“ApplicationModule/Action”(即没有id)可能只调用索引操作,您可能需要添加一个
将“索引|操作1 |操作2”替换为有效操作的单独列表
或者,您可以直接卸载添加这些新路由并覆盖HandleUnknownAction
例如
在ApplicationModule控制器中
protected override void HandleUnknownAction(string actionName) {
var result = Index(actionName);
result.ExecuteResult(ControllerContext);
}
理解路由机制需要实践和经验。路由机制背后的思想是获取传入URL并获取将处理请求的处理程序(IHttpHandler)对象。至于您的问题,MapRoute扩展方法的第一个参数是路由的名称。设置MVC项目时,您会得到:
routes.MapRoute( _
' "Default" is your route name. It can be null, "" or some other name that you give it
"Default", _
' This is your URL with parameters
"{controller}/{action}/{id}", _
' Parameter defaults
new { .controller = "Home", .action = "Index", .id = UrlParameter.Optional })
路由名称参数表允许您仅通过使用名称调用控制器和操作。例如,而不是:
return RedirectToAction("ActionName", "ControllerName", new { paramId = 1234 });
您可以使用路由名称,如
return RedirectToRoute("MyRouteName", new { paramId = 1234 });
至于路线的配置,应如下所示:
routes.MapRoute( _
"YourRouteName", _
"ApplicationModule/{id}", _
New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParemeter.Optional })
href="<%= Url.Content("Index", "ApplicationModule", With New { .id = app.id })"
并将此新路由配置置于MVC在创建项目时为您提供的默认路由配置之上,否则您的新路由配置将永远不会被捕获,并且默认路由配置将始终尝试解析传入URL
最后还有一个建议,而不是使用:
href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"
href=“ApplicationModule/Index/”
使用Url。内容如下:
routes.MapRoute( _
"YourRouteName", _
"ApplicationModule/{id}", _
New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParemeter.Optional })
href="<%= Url.Content("Index", "ApplicationModule", With New { .id = app.id })"
href=“例如:以下Url调用文章控制器的index方法,但没有指定它-href=“Article“。问题是由于id造成的吗?是的,它将id视为操作名称。因此,最后我必须严格遵守Url中指定的索引,对吗?是的,如果要指定要传递给操作的参数,必须指定操作名称。所以在这种情况下,它必须是Index/idThank,现在我至少了解了它的工作原理。最后一个问题,关于Bob Vale所说的:如果前一个未能根据指定的Url完成请求,MVC是否会循环通过各种路由?如果用户被带到“ApplicationModule/1234”,它将如何区分这两个操作之间的区别?我是否误解了路由,当第一条路线失败时,它不继续前进吗?我认为它使用了与模式匹配的第一条路线。似乎没有任何检查来确定url是否真的有效。使用约束来分离优秀的解释,即使像我这样的新手也能理解+1.小费