假设我已经设置了如下的URL结构(ASP.NET MVC2)
http://localhost:XXXX/Product/
点击链接按颜色浏览
http://localhost:XXXX/Product/Color/
点击链接按类型(即笔)
浏览红色项目http://localhost:XXXX/Product/Color/Red/Pen
在控制器中,我需要根据这些标准进行选择。除了以前,我可以去
public ActionResult ShowTypesForColor(string color)
但要做到这一点:
public ActionResult ShowItems(string type)
我还需要选择的颜色。
我怎么能这样做?分裂url字符串是唯一的方法吗?
编辑:也许我在global.asax.cs
routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" });
routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" });
routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" });
我认为我不能像我那样定义最后一个?有两个{}值?
答案 0 :(得分:1)
您的最后一条路线似乎完全有效。它将映射到具有以下签名的操作:
ActionResult ShowDetails(string color, string type) {
return View(/*view params*/);
}
编辑我认为订单错误,所以如果最后一条路线没有被解雇,请尝试这样做:
routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" });
routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" });
routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" });
MVC路由的顺序应该从最具体到最不具体,否则最不具体的路由(/product/color/{color}
)将与更具体的product/color/red/pen
答案 1 :(得分:1)
你可以在您的路线中放置多个令牌(例如,{color}和{type}),但它不会按照您的方式进行工作。为什么要将“颜色”定义为URL的第二部分?为什么不做/产品/红色和/产品/红/笔?这是不一致的... /颜色/红色而不是...... /类型/笔,所以我只是完全抛弃“颜色”和“类型”限定符。
我将这样定义你的ShowItems()方法:
public ActionResult ShowItems(string color, string type)
这将允许你有一个像/ Products / Red / Pen这样的路线,你的路线映射到这个ShowItems()方法。但是你仍然需要将它与ShowTypesForColor()方法区分开来,其中也采用第一个颜色参数。路由框架只会将类型视为null - 对于具有两个标记的路由,请确保您有一个路由约束,指定颜色和类型都不能为null /空(即,对于ShowItems()路由)。