具有不同参数名称的Asp.Net路由

时间:2011-07-12 19:02:12

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

我正在尝试映射某些路由,以便自动生成的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时,生成的网址符合预期,但当参数名称为type而不是controller/action/typevalue时,会生成类似controller/action/?type=typevalue

有没有办法生成类似于controller/action/typevalue的网址,以保持Admin_default路由的生成器行为完好无损?

3 个答案:

答案 0 :(得分:5)

  

当参数名称为id时,生成的url符合预期,但是何时生成   参数名称是type,而不是controller / action / typevalue,它   生成类似controller / action /?type = typevalue

的内容

这是因为第一条路线用于映射网址(ID是可选的)。

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

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

答案 1 :(得分:2)

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

编辑:再次阅读你的问题之后,我的解决办法并没有保持你的第一条路线完好无损......

答案 2 :(得分:0)

您只需要一条路线。

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();
   }

}