【发布时间】:2014-03-18 08:24:33
【问题描述】:
有没有办法根据控制器的操作进行不同的路由?
例如:
默认路由
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这会使网址看起来像
localhost:/Home/{someaction}/{id}
如果控制器的动作是
public ActionResult SomeAction(int id)
{
return Content("Sup?");
}
但假设我有这个动作
public ActionResult AnotherAction(Guid productCategoryId, Guid productId)
{
return content("Hello!");
}
如果我没有任何自定义路由,那么路由看起来像
localhost:/Home/AnotherAction?productCategoryId=someGuidId&productId=someGuidId
但是如果我希望路线看起来像这个动作
localhost/Home/AnotherAction/productCategoryGuidId/productGuidId
我该怎么做?
我添加了一条自定义路线
routes.MapRoute(
name: "appointment",
url: "{controller}/{action}/{appointmentId}/{attendeeId}",
defaults: new {controller = "Home",action = "Index", appointmentId = "",attendeeId="" }
);
但是我如何说控制器的操作是使用该路由而不是默认路由。
另外,我读到 MVC 5 中有 attribute routing。这对我的情况有帮助吗?我将如何使用它?
【问题讨论】:
-
自定义路线是要走的路。一定要先添加,最后指定默认路由。
-
所以如果我有自定义路由,我不必告诉我的控制器使用具有特定名称的路由映射?
-
你可以。我真的无法提供反驳的论据。也许,在可扩展性方面,使用该属性会更好不。如果您有另一个(或许多其他)操作需要使用此路由,会发生什么?你需要装饰每个动作。如果您正确设置了路由,服务器会自动为您执行此操作。根据经验,您需要首先设置最具体的路线,最后设置最通用的路线。正如@lnanikian 所提到的,路线是按照它们定义的顺序检查的。找到有效规则后,将不再检查其他规则。一般路线将始终匹配。
-
感谢您的建议
标签: asp.net-mvc asp.net-mvc-routing url-routing asp.net-mvc-5