我有一个名为HotelsController
的控制器来插入和编辑酒店。
它具有以下设置(为简单起见,删除了方法实现):
[RoutePrefix("{member_id:int}/hotels")]
public class HotelsController : ApplicationController
{
[Route("delete/{id:int}", Name = NamedRoutes.HotelDelete)]
public ActionResult Delete(int id)
{
}
[Route("new", Name = NamedRoutes.HotelNew)]
public ActionResult New()
{
}
[HttpPost]
[ValidateInput(false)]
public ActionResult New(HotelDataEntry hotel)
{
}
[Route("edit/{id:int}", Name = NamedRoutes.HotelEdit)]
public ActionResult Edit(int id)
{
}
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(HotelDataEntry hotel)
{
}
}
如您所见,以下路由使用属性路由:
以下路由不使用属性路由:
路由在Global.asax.cs中设置如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
Routen.Standard.ToString(),
"{member_id}/{controller}/{action}/{id}",
new { action = "browse", id = UrlParameter.Optional },
new { id = AllowedIdsRegExOptional }
);
}
问题:属性路由有效。我可以使用http://localhost:54868/301011/hotels/edit
调用“编辑”操作,但该页面上的表单应发布到同一个uri并调用不使用属性路由的操作。但是,再次调用使用基于属性的路由的操作。为什么呢?
表单随method="post"
一起提供。你知道为什么不使用基于约定的路线吗?谢谢你的帮助。
修改:我尝试在属性路由的“新建”和“修改”操作前添加[HttpGet]
。结果是,在发布表单时,ASP.NET显示路由无效的错误。因此,由于某些原因,基于约定的路由不适用于控制器。
答案 0 :(得分:0)
似乎你不能在同一个控制器中使用这两种(基于属性和基于conventino的)路由技术。
所以我解决这个问题的方法是将基于属性的路由添加到两个“无法访问”的操作方法中。这些方法的路由与具有相同名称的操作的路由相同,但路由的名称不同(因为路由名称必须是唯一的)。
[RoutePrefix("{member_id:int}/hotels")]
public class HotelsController : ApplicationController
{
[Route("delete/{id:int}", Name = NamedRoutes.HotelDelete)]
public ActionResult Delete(int id)
{
}
[Route("new", Name = NamedRoutes.HotelNew)]
public ActionResult New()
{
}
[HttpPost]
[ValidateInput(false)]
[Route("new", Name = NamedRoutes.HotelNewPost)]
public ActionResult New(HotelDataEntry hotel)
{
}
[Route("edit/{id:int}", Name = NamedRoutes.HotelEdit)]
public ActionResult Edit(int id)
{
}
[HttpPost]
[ValidateInput(false)]
[Route("edit/{id:int}", Name = NamedRoutes.HotelEditPost)]
public ActionResult Edit(HotelDataEntry hotel)
{
}
}