该控制器如何获得所需的值?

时间:2010-08-31 03:38:02

标签: c# asp.net visual-studio asp.net-mvc-2

假设我已经设置了如下的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" });

我认为我不能像我那样定义最后一个?有两个{}值?

2 个答案:

答案 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 /product/color/{color}/{type}匹配>

答案 1 :(得分:1)

可以在您的路线中放置多个令牌(例如,{color}和{type}),但它不会按照您的方式进行工作。为什么要将“颜色”定义为URL的第二部分?为什么不做/产品/红色和/产品/红/笔?这是不一致的... /颜色/红色而不是...... /类型/笔,所以我只是完全抛弃“颜色”和“类型”限定符。

我将这样定义你的ShowItems()方法:

public ActionResult ShowItems(string color, string type)

这将允许你有一个像/ Products / Red / Pen这样的路线,你的路线映射到这个ShowItems()方法。但是你仍然需要将它与ShowTypesForColor()方法区分开来,其中采用第一个颜色参数。路由框架只会将类型视为null - 对于具有两个标记的路由,请确保您有一个路由约束,指定颜色和类型都不能为null /空(即,对于ShowItems()路由)。