因此,假设您需要在RESTful路由中使用这些URL:
/Company/About
/Company/Product/View
/Company/Product/Edit
/Company/Contact/View
/Company/Contact/Edit
我假设所有这些操作都需要在同一个控制器(即公司)中,我还假设路由在Global.asax中看起来像这样:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("mission", "Company/Product/{action}/{id}",
new { controller = "Company", id = "" });
routes.MapRoute("mission", "Company/Contract/{action}/{id}",
new { controller = "Company", id = "" });
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
当试图将所有这些塞入一个控制器时出现问题(同样,我的假设是在同一控制器中具有所有这些是正确的),因为控制器动作名称将使一切都搞乱。这就是我的意思:
在此示例中,我们将需要在公司控制器中命名为以下的控制器操作:
About (for Company/About)
ProductView (for /Company/Product/View)
ProductEdit (for /Company/Product/Edit)
ContactView (for /Company/Contact/View)
ContactEdit (for /Company/Contact/Edit)
但是,这些操作名称与路由表所期望的不匹配。例如,如果用户浏览/ Company / Product / View,则路由将直接流向Company控制器中名为“View”的操作。如果用户浏览/ Company / Contact / View会怎样?路由将流程路由到公司控制器中的同一“视图”表。如何将这些请求路由到不同的视图?
您如何解决这个问题?我的目标是尽可能地保持RESTful。
答案 0 :(得分:0)
首先要成为RESTful,不应该在路由名称中包含操作。您应该通过http谓词路由,而不是在路线中指定编辑或视图。我还建议使用属性路由
这是一个示例控制器:
[RoutePrefix("api/company")]
public class CompanyController : ApiController
{
[Route("product"), HttpGet]
public Product ViewProduct()
{
}
[Route("product"), HttpPut]
public Product EditProduct()
{
}
[Route("contact"), HttpGet]
public Product ViewContact()
{
}
[Route("contact"), HttpPut]
public Product EditContact()
{
}
}