ASP.NET MVC路由映射Maproute参数

5

我目前正在学习MVC路由框架,但对RouteCollection.MapRoute方法所接受的参数有些困惑。

如果我以下列请求为例:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 - List item

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

它与以下签名映射

public static Route MapRoute(
    this RouteCollection routes,
    string name,
    string url,
    Object defaults
)

我的问题涉及“对象默认值”。

  1. 为什么我们要使用它作为 new { controller = "Home", action = "Index", id = "" }
  2. 这是固定的格式吗?
  3. CLR 如何解释参数序列

跟进问题:

a. 为什么我们将控制器、操作或ID放在括号 {} 中装饰?

b. URL 指定和默认值之间是否有匹配?


http://msdn.microsoft.com/en-us/library/vstudio/cc668201(v=vs.100).aspx - Krushnakant Ladani
2个回答

3
为什么我们要将它用作新控制器 { controller = "Home", action = "Index", id = "" }? 基本上是为了使用默认值初始化路由。您传递到 MapRoute 方法中的值会转换为 IDictionary,以供后续查找。
Is this is a fixed format?

不必如 URL 中所示提供所有值,您可以省略或添加更多值。在默认情况下指定的值将用于查找。
例如,您可以按以下方式设置路由名称“Search”:
    routes.MapRoute(
        name: "Search",
        url: "{controller}/{action}/{searchId}",
        defaults: new {controller = "Account", action = "Login", searchId = UrlParameter.Optional}
        );

通过将它们添加到一个字典中(准确来说是RouteValueDictionary)来解释参数序列。
简短的答案是,这是一种惯例...长答案是,根据MSDN,摘自MSDN文章
在URL模式中,您可以通过用大括号({和})括起来来定义占位符。您可以在一个段中定义多个占位符,但必须用文字值分隔它们。例如,{language}-{country}/{action}是有效的路由模式。但是,{language}{country}/{action}不是一个有效的模式,因为没有文字值或分隔符分隔占位符。因此,路由无法确定在哪里将语言占位符的值与国家占位符的值分开。
b. Is there any match in between URL specify and defaults?

是的,缺省值是用于URL中的占位符。如果您添加了更多的默认值,则会被忽略。如果URL中没有包含该参数的值,则会使用默认值。

如需更多信息,请参阅此优秀的MSDN文章

希望这有所帮助。


非常感谢您的快速回复,这对我帮助很大。还有一些关于同样问题的快速提问:
  1. url: "{controller}/{action}/{searchId}" 为什么我们要在括号{}中装饰控制器、操作或ID?
  2. URL指定和默认值之间是否有匹配?
- Bharat Joshi
我已经将您的后续问题添加到原始问题中,以供其他读者参考。请查看我的更新答案。顺便问一下,您有阅读MSDN文章吗?您觉得它有用吗? - SBirthare
是的,我查看了链接,非常有用。非常感谢。但是我对{} URL模式有点困惑,我尝试过"{controller}/{action}"和"{action}/{controller}",两者都完美地工作 :) - Bharat Joshi
是的,在这两种情况下都可以工作。您的URL模式只是告诉服务器名称后传入请求的URL中将有多少占位符。只要它存在于URL中并且默认值对应的占位符,位置就不重要。我建议多尝试一些,很快就能理解了。 - SBirthare
@user3886602 - 当我对哪个路由匹配感到困惑时,我会使用这个工具... http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/ - SBirthare

0
routes.MapRoute(
    name: "Search",
    url: "{controller}/{action}/{searchId}",
    defaults: new {controller = "Account", action = "Login", searchId = UrlParameter.Optional},
    new {id = @"\d{1, 2}" }
);

new表达式在MVC 5约束中不起作用吗?


这似乎是一个通常包含在答案中的评论(当您有更多声望时)。您可能会更容易得到回应,如果您将其作为自己的问题引用已发布的答案... - Stuart Siegler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接