Asp.net 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

我有一个MVC应用程序,其中只指定了默认路由,如下所示:

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.小费