我试图让这条路线在我的 MVC3 应用程序中工作,但操作方法总是获取空参数。
一般的想法是我的路线有一个强制参数“类别”和一个可选参数“城市”。可能的请求 URL 如下所示:
/Map/SelectCategory/Restaurants
/Map/SelectCategory/Restaurants/Washington
此路由旨在返回 JSON 数据,因为它将用作 Web 服务,这与我在此之后定义的标准 /Map/Category 操作相反,该操作适用于常规网页并且工作正常。
所以,我的路线在 Global.asax 中定义如下:
routes.MapRoute( // Map It! Controller
"MapSvc", // route name
"Map/SelectCategory/{catID}/{city}", // URL with parameters
new { controller = "Map", action = "SelectCategory", city= UrlParameter.Optional }
);
.. Here a route for /Map/Category/{id} ..
.. Here a route for /Map/Placemark/{id} ..
据我所知,我可以在路由定义中省略“catID”,因为它会自动绑定为非可选的,对吧?通过定义它进行尝试,但结果相同。
最后但并非最不重要的一点是,我在 Controller 中的 Action 定义如下:
public ActionResult SelectCategory(string catID, string city)
{
IEnumerable<Models.Placemark> list;
if (!string.IsNullOrEmpty(city)) {
list = doThis();
} else {
list = doThat();
}
return Json(list);
}
现在我在操作的第一个语句上放置了一个断点,但是当我请求路由中所述的 URL (/Map/SelectCategory/Restaurants) 时,我看到类别和城市参数都是 NULL,在这种情况下,我期望类别参数为“餐厅”。
解决方案 注意:因为我没有 100 点声望,所以我必须等待 6 个小时才能发布答案,我真的要走了,所以就在这里。
感谢@tsegay 让我朝着正确的方向前进。Global.asax 中定义的所有其他路由都具有带参数的显式 URL,但问题是因为默认路由(在空解决方案模板中创建的标准路由)对于这种情况来说过于贪婪:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
我将它移到 Global.asax 中路线列表的末尾,现在问题消失了!非常感谢你让我朝着正确的方向前进。