我有一个MVC应用程序,只有默认路由指定如下:
routes.MapRoute( _
"Default", _
"{controller}/{action}/{id}", _
New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
)
首先,我想了解这条路线的第一个参数中“默认”一词的含义,以便建立一条可以按我的意愿运作的路线。
通过以下内容,我希望能够调用ApplicationModule控制器的索引,而无需在Url中特别提及索引方法,就像我对其他控制器所做的那样:
href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"
如果我从此Url中删除/ Index,应用程序会告诉我找不到所述资源。 我做错了什么?
答案 0 :(得分:1)
默认只是路线的名称。
您可以设置一条可以执行此操作的路线,但它可能会破坏您网站的其余部分。
问题是您希望它自动将URL中的第二个参数视为ID,但它如何知道它是ID而不是操作方法名称?
答案 1 :(得分:1)
了解路由机制需要实践和经验。路由机制背后的想法是获取传入的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 })
并将此新路由配置置于MVC在创建项目时为您提供的默认路由配置之上,否则您的新路由配置将永远不会被捕获,默认路由配置将始终尝试解析传入的URL。
还有一个建议,而不是使用:
href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"
使用Url.Content,如下所示:
href="<%= Url.Content("Index", "ApplicationModule", With New { .id = app.id })"
这将自动解决您的虚拟路径,看起来有点整洁。 如果你有机会获得Steven Sanderson的Pro ASP.NET MVC 2框架,你将会对URL和路由机制有更清晰的了解。
致以最诚挚的问候,
Huske
答案 2 :(得分:0)
答案1:“默认”只是您内部参考路线的名称,可帮助您描述路线的用途。
回答2:在默认值之前添加此映射。
routes.MapRoute( _
"ApplicationModuleIndex", _
"ApplicationModule/{id}", _
New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParameter.Optional} _
)
这可能会产生副作用,即URL“ApplicationModule / Action”(即没有id)可能只是调用索引操作而你可能需要一个添加路径(在前一个之前)
routes.MapRoute( _
"ApplicationModule", _
"ApplicationModule/{action}", _
New With {.controller = "ApplicationModule", .action = "Index"} _
New With {.action = "Index|Action1|Action2"} _
)
将"Index|Action1|Action2"
替换为|
分隔的有效操作列表
或者你可以转储添加这些新路线并覆盖HandleUnknownAction
例如
在ApplicationModule控制器中
protected override void HandleUnknownAction(string actionName) {
var result = Index(actionName);
result.ExecuteResult(ControllerContext);
}