了解和配置路由

时间:2011-08-03 10:03:18

标签: asp.net-mvc asp.net-mvc-routing

我有一个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,应用程序会告诉我找不到所述资源。 我做错了什么?

3 个答案:

答案 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);
}