【问题标题】:Asp.Net Routing with different parameter names具有不同参数名称的 Asp.Net 路由
【发布时间】:2011-07-12 19:02:11
【问题描述】:

我正在尝试映射某些路线,以便自动生成的 Url 看起来像 Admin/controller/action/param 对于这两个代码块, @Url.Action("action","controller",new{id="param"})@Url.Action("action","controller",new{type="param"})

我在区域注册中做的是以下,

context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", 
                  id = UrlParameter.Optional }, 
            new string[] { "namespaces" });

        context.MapRoute(
            "Admin_type",
            "Admin/{controller}/{action}/{type}",
            new { action = "Index", 
                  type = UrlParameter.Optional }, 
            new string[] { "namespaces" });

当参数名称为id时,生成的url如预期的那样,但是当参数名称为type时,而不是controller/action/typevalue,它会生成类似controller/action/?type=typevalue的东西

有没有办法生成类似controller/action/typevalue 的url,保持Admin_default 路由的生成器行为不变?

【问题讨论】:

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


    【解决方案1】:

    当参数名称为id时,生成的url如预期的那样,但是当 参数名称是类型,而不是控制器/动作/类型值,它 生成类似 controller/action/?type=typevalue

    这是因为第一个路由用于映射 url(id 是可选的)。

    您可以尝试为您的路线添加一些约束。我猜你的 id 参数是一个整数,类型参数是一个字符串。在这种情况下,您可以尝试以下路线:

    context.MapRoute(
                    "Admin_default",
                    "Admin/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional }, 
                    new { id = @"\d+" },    
                    new string[] { "namespaces" });
    
    context.MapRoute(
                    "Admin_type",
                    "Admin/{controller}/{action}/{type}",
                    new { action = "Index", type = UrlParameter.Optional }, 
                    new string[] { "namespaces" });
    

    您可以找到更多关于路线限制的信息here

    【讨论】:

    • 谢谢。这与预期格式的所有 url 一样工作。从来没有考虑过路线限制..我的坏..!不管怎么说,还是要谢谢你。接受你的回答。
    【解决方案2】:

    您是否尝试过删除 id 上的可选默认值?在这种情况下,仅提供类型参数时,第一条路由不应匹配。

    编辑:再次阅读您的问题后,我的解决方案无法保持您的第一条路线完好无损......

    【讨论】:

      【解决方案3】:

      您只需要一条路线。

      context.MapRoute("Admin_default",             
               "Admin/{action}/{id}",            
               new { action = "Index",                    
               id = UrlParameter.Optional },              
              new string[] { "namespaces" }); 
      

      在你的控制器中

      网址: http://website/Admin/index/hello

      http://website/Admin/type/342

      public class AdminController()
      {
         public ActionResult Index(string id)
         {
           // do whatever
           returne View();
         }
      
         public ActionResult type(string id)
         {
           // do whatever
           returne View();
         }
      
      }
      

      【讨论】:

      • 谢谢,但我说的是参数而不是动作。
      猜你喜欢
      • 1970-01-01
      • 2018-11-04
      • 2017-05-27
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多