MVC路由:在Url中的多个过滤器参数之间生成Dash

时间:2017-04-27 06:40:36

标签: asp.net-mvc url filtering asp.net-mvc-routing

我是MVC的新手,我的路线定义如下:

   routes.MapRoute(
            name: "NewRoute",
            url: "P/{colorname}-{id}/{statename}-{materialtype}-{HasPrice}", 
        defaults: new
            {
                controller = "Products",
                action = "P", 
                id = UrlParameter.Optional, 
                statename = UrlParameter.Optional,
                colorname = UrlParameter.Optional,
                materialtype = UrlParameter.Optional,
                HasPrice = UrlParameter.Optional

            }
        );

当用户在我的网站上搜索时,我希望显示以下网址:

P /قیمت-نوعمواد-ناماستان/شماره-رنگ

但得到404错误并显示此网址:/ P / - / -

请帮帮我... 感谢...

1 个答案:

答案 0 :(得分:0)

首先,在这种情况下,拥有可选的路线值没有任何意义。可选参数如果它们是最右边的参数,后面只有另一个可选参数或/,则可以工作。你的网址中有破折号,这使得这不可能。因此,请删除路线中的可选声明:

   routes.MapRoute(
        name: "NewRoute",
        url: "P/{colorname}-{id}/{statename}-{materialtype}-{HasPrice}", 
        defaults: new
        {
            controller = "Products",
            action = "P"
        }
    );

您还必须确保route can be matched(即没有在其之前注册的路由将导致其无法访问)。在简单的英语中,这意味着您必须在默认路线之前定义上述路线

请注意,因为没有任何参数是可选的,所以如果有任何缺失参数,将始终跳过路径 - 这是理想的行为,因为您的配置中可能存在您想要匹配的其他路径

现在,要生成所需的URL,您需要在生成URL时提供缺少的路由数据。例如,您可以使用上述路线生成指向问题中URL的超链接:

@Html.ActionLink("My Link", "P", "Products", 
    new { colorname = "رنگ", id = "شماره", statename = "نام استان", 
        materialtype = "نوع مواد", HasPrice = "قیمت" }, null)

当然,这假设您已经创建了一个名为ProductsController的控制器,其中包含一个名为P的操作。