路线突破'何时添加额外的UrlParameter

时间:2014-12-16 14:49:47

标签: asp.net-mvc-4

我的申请效果很好。

在我的视图中,我有一个指向MyProducts控制器的链接(删除所有逻辑以保持后期整洁)

这看起来像

    [HttpGet]
    public ActionResult Index(string product, string gender)
    {
        return RedirectToAction("Index", "Home", new { product = product, gender = gender });
    }

在我的HomeController中,我有

    public ActionResult Index(string product, string gender)
    {
        ViewBag.Message = product;

        return View();
    }

并在我的视图中

@using (Html.BeginForm("Index", "MyProduct", FormMethod.Get))
{ 
    <input name="product" /><br />
    <input name="gender" /><br />
    <input type="submit" />
}

这很简单。它很棒。

如果我使用以下路线表

 routes.MapRoute(
           name: "Default",
           url: "{controller}/{action}/{product}",
           defaults: new { controller = "Home", action = "Index", product = UrlParameter.Optional}
       );

一切正常,当我搜索产品时,网址呈现为

www.mysite.com/Home/Index/Shoes

然而,我需要能够按性别过滤,例如男士鞋或女士鞋。

   routes.MapRoute(
           name: "Default",
           url: "{controller}/{action}/{product}/{gender}/",
           defaults: new { controller = "Home", action = "Index", product = UrlParameter.Optional, gender = UrlParameter.Optional}
       );

当我用两个参数执行搜索时,这会杀死我的好路由,而不是向我显示所需的网址,如

www.mysite.com/Home/Index/Shoes/Ladies

实际上是显示

www.mysite.com/Home/Index/?product=Shoes&gender=Ladies

我看不出我做错了什么

1 个答案:

答案 0 :(得分:1)

创建多个路由,连续多个可选参数将导致url生成器使用参数

routes.MapRoute( 
    name: "GenderOptional", 
    url: "{controller}/{action}/{product}/{gender}", 
    defaults: new { controller = "Home", action = "Index", gender = UrlParameter.Optional } 
); 

routes.MapRoute( 
    name: "Default", 
    url: "{controller}/{action}/{product}", 
    defaults: new { controller = "Home", action = "Index", product = UrlParameter.Optional } 
);