ASP.NET MVC路由问题

时间:2011-03-25 14:50:32

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

我有关于MVC路由的简单问题。如何构建Html.ActionLink,以生成以下链接http://mysite.com/phones/samsung
现在它生成为http://mysite.com/phones/brand?brand=samsung
另外,我想避免在URL中提及动作名称 有我的代码:

路线:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

控制器:

MySyteDBEntities ms = new MySyteDBEntities();

public ActionResult Index()
{
    ViewBag.Brand = ms.Phones.Select(x => x.Brand).Distinct();
    return View();            
}

public ActionResult Brand(string brand)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}

索引查看代码:

@foreach (string item in ViewBag.Brand)
{                    
    <div>@Html.ActionLink(item, "Brand", new { brand = item })</div>
}

5 个答案:

答案 0 :(得分:3)

在MapRoute中,您没有动作空间,因此asp.net将始终使用默认操作“索引”。

默认情况下,您的路由应如下所示:

routes.MapRoute(" Default", "{controller}"/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }

你错过了动作部分。

您的actionlink中与您的路线中的参数不匹配的路线值将是查询字符串参数。因此,您需要在路线中将“类别”更改为“品牌”。

试试这个:

routes.MapRoute(null, "Phones/{brand}", 
 new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

@foreach (string item in ViewBag.Brand)
{                    
 <div>@Html.ActionLink(item, "Index", "Phones", new { brand = item }, null)</div>
}

如果当前视图通过另一个路径映射,请确保在ActionLink中显式调用控制器,否则它无法识别brand参数。

答案 1 :(得分:1)

尝试(此路线应在默认路线之前注册,如果有的话)

        routes.MapRoute(
         "Phones", // Route name
         "Phones/{[^(Index)]brand}", // URL with parameters
         new { controller = "Phones", action = "Brand", brand = "" } // Parameter defaults
     );

有了这个,http://mysite.com/phones/ - &gt;应该去索引行动和 http://mysite.com/phones/samsung - &gt;应该去品牌行动。

答案 2 :(得分:1)

我找到了问题的根源。我只需要在MapRoute中删除最后一块(品牌可选参数)。野兔是代码:

routes.MapRoute(null, "Phones/{brand}", new { controller = "Phones", action = "Brand" });

答案 3 :(得分:0)

routes.MapRoute(null, "Phones/{id}", 
new { controller = "Phones", action = "Index", id= UrlParameter.Optional })

public ActionResult Brand(string id)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}

通过使用id作为参数名称,它将阻止路由使用查询字符串键值对。

您的无参数GET和View代码仍然无需任何更改即可运行。

答案 4 :(得分:0)

如果我没记错的话,{brand}部分需要作为参数的一部分包含在内:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

请记住,它需要在任何默认路线之前。