ASP.NET MVC MapRoute超过1个参数问题

时间:2018-02-28 18:45:14

标签: c# asp.net asp.net-mvc routes asp.net-mvc-routing

我试图将MapRoute与多个参数一起使用,但它无法正常工作。

我的RegisterRoutes

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    routes.MapRoute(
        "TestRoute",                                              // Route name
        "{controller}/{action}/{id}/{tID}",                           // URL with parameters
        new { controller = "Test", action = "Index", id = "", tID = "" }  // Parameter defaults
    );
}

我的测试控制器:

public class TestController : Controller
{
    public ActionResult Index(int? id, int? tID)
    {
        // Some code to create viewModel

        return View(viewModel);
    }
}

我从Html.ActionLink

调用此方法
@Html.ActionLink(@item.Description, "Index", "Test", 
    new { id = @item.CatID, tID = @item.myTID }, null)

但是,它会将网址返回为:/Test/Index/3?tID=264981而不是/Test/Index/3/264981

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

  1. 应在普通路线之前先注册更具体的路线。
  2. 由于第一场比赛总是胜利,所以路线需要以某种方式约束。例如,保持在路由B之前注册的路由A匹配应由路由B处理的情况。
  3. 最符合逻辑的行为通常是使路线值必需,而不是选项。

  4. public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        // Register the most specific route first
        routes.MapRoute(
            "TestRoute",
    
            // Constrain the URL - the simplest way is just to add a literal
            // segment like this, but you could make a route constraint instead.
            "Test/{action}/{id}/{tID}", 
    
            // Don't set a value for id or tID to make these route values required.
            // If it makes sense to use /Test/Action without any additional segments,
            // then setting defaults is okay.
            new { controller = "Test", action = "Index" }  
        );
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    

    参考:Why map special routes first before common routes in asp.net mvc?