3

我想一定路线地图,以便自动生成的URL看起来像 Admin/controller/action/param对于这两个代码块, @Url.Action("action","controller",new{id="param"})@Url.Action("action","controller",new{type="param"})Asp.Net路由具有不同的参数名

我所做的是以下在该地区的注册,

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的网址,保持Admin_default路由的生成器行为不受影响?

回答

5

时参数的名字是ID,生成的URL被预期,但是当 参数名称是type,而不是controller/action/typeva略,它 产生像控制器/动作/β型= typevalue

这是因为第一路线用于映射的URL(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更多信息。

+0

谢谢。如预期的那样,所有网址都以预期的格式运行。从来没有看过路线限制..我的坏..!不管怎么说,还是要谢谢你。接受你的答案。 –

2

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

编辑:重新阅读你的问题后,我的解决方案不会保留第一条路线完整...

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

} 
+0

谢谢,但我说的是参数而不是动作。 –