我有关于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>
}
答案 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 });
请记住,它需要在任何默认路线之前。