如何在ASP.NET MVC中创建具有多个空参数的路由?

时间:2013-12-09 21:22:26

标签: asp.net-mvc parameters routing

这是我的网址格式:

controller/action/p1/p2/p3/

在路由中我有这个规则:

url: 
    {controller}/{action}/{p1}/{p2}/{p3}/
defaults: 
    new { controller = "controller", action = "action", p1= "", p2= "", p3= "" }

在控制器中我有:

action(p1 = "", p2 = "", p3 = "")
{
    ... 
}

我需要传递此网址controller/action//p2/p3/,其中p1 = ""问题出在操作方法中,如果p1 = ""默认为p2的值。我的意思是p1现在需要p2的价值。

我怎么能让这个工作?也许如果我添加更多路由,或者是否有另一种解决方法来完成空参数之间的传递?

2 个答案:

答案 0 :(得分:0)

假设所有p都是字符串,区分不同路由的唯一方法是参数的数量。所以为了实现以下映射:

controller/action/p2/p3/

您可以通过在具有三个参数的那个之前添加以下映射来完成此操作:

url: 
    {controller}/{action}/{p2}/{p3}/
defaults: 
    new { controller = "controller", action = "action", p2= "", p3= "" }

但是,如果不使用QueryString参数,则无法使用相同数量的参数并以不同方式映射它们,例如:

controller/action?p1=""&p3=""

答案 1 :(得分:0)

您可以使用空属性链接进行各种组合,例如:

        var defaultObj = new { controller = "controller", action = "action", p1 = UrlParameter.Optional, p2 = UrlParameter.Optional, p3 = UrlParameter.Optional };

        string[] combinations = {
            "{controller}/{action}/{p1}/{p2}/{p3}",
            "{controller}/{action}//{p2}/{p3}",
            "{controller}/{action}/{p1}//{p3}",
            "{controller}/{action}/{p1}/{p2}/",
        };

        for (int i = 0; i < combinations.Length; i++)
        {
            routes.MapRoute(
                name: "route" + i.ToString(),
                url: combinations[i],
                defaults: defaultObj
            );
        }

不是最佳解决方案,但适用于我。

相关问题