【问题标题】:ASP.NET MVC Routing Maproute parameterASP.NET MVC 路由 Maproute 参数
【发布时间】:2015-07-03 23:17:55
【问题描述】:

我正在处理MVC routing frame work。我对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 interpret sequence的参数?

跟进问题:

一个。为什么我们在括号 {} 中装饰控制器、动作或 id?

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

【问题讨论】:

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


【解决方案1】:

为什么我们将它用作 new { controller = "Home", action = "Index", id = "" }

基本上用默认值初始化路由。您传递给 MapRoute 方法的值转换为 IDictionary<string, object> 以供以后查找。

Is this is a fixed format?

不,您可以根据您的网址省略或添加更多值。您在默认值中指定的值将用于查找。

例如,您可以设置路由名称搜索如下:

    routes.MapRoute(
        name: "Search",
        url: "{controller}/{action}/{searchId}",
        defaults: new {controller = "Account", action = "Login", searchId = UrlParameter.Optional}
        );

CLR如何解释参数的序列化?

通过将它们添加到字典中(确切地说是 RouteValueDictionary)。

一个。为什么我们在括号 {} 中装饰控制器、动作或 id?

简答,这是一个约定...长回答,根据 MSDN,摘自MSDN Article

在 URL 模式中,您可以通过将占位符括在大括号中来定义它们 ( { 和 } )。您可以在一个段中定义多个占位符, 但它们必须用文字值分隔。例如, {language}-{country}/{action} 是有效的路由模式。然而, {language}{country}/{action} 不是一个有效的模式,因为有 占位符之间没有文字值或分隔符。所以, 路由无法确定在哪里分隔语言的值 来自国家/地区占位符值的占位符。

b. Is there any match in between URL specify and defaults?

是的,默认值用于 URL 中的占位符。如果您添加更多默认值然后占位符,它将被忽略。如果 URL 中不包含该参数的值,则使用默认值。

更多信息,我会为你指出这个优秀的MSDN Article

希望这会有所帮助。

【讨论】:

  • 非常感谢您的快速响应,这对您有很大帮助。关于相同 1. 的一些更快速的问题。 url: "{controller}/{action}/{searchId}" 为什么我们装饰控制器、动作或 id在括号内 {} 2. 在 URL 指定和默认值之间是否有任何匹配?
  • 我已在您的原始问题中为其他读者添加了您的后续问题。请参阅我更新的答案。顺便问一下,你读过 MSDN 文章吗?你觉得它有用吗?
  • 是的,我浏览了链接,非常有用。非常感谢。但我对 {} URL 模式有点困惑,我尝试过 "{controller}/{action}" 和 "{action}/{controller}" 都可以正常工作:)
  • 是的,这两种情况都可以。您的 URL 模式只是告诉服务器名称后传入请求的 url 中有多少占位符。位置无关紧要,只要它存在于 URL 中并且默认值具有相应占位符的值。我建议多尝试一下,你很快就会得到它。
  • @user3886602 - 当我对匹配的路由感到困惑时,我会使用这个工具...haacked.com/archive/2008/03/13/url-routing-debugger.aspx
【解决方案2】:
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 约束?

【讨论】:

  • 这看起来像是通常会包含在答案中的评论(当您有更多代表时)。您可能会在引用已发布答案的自己的问题中获得更多牵引力...
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2018-07-30
  • 2012-09-12
相关资源
最近更新 更多