【发布时间】:2014-08-18 07:45:48
【问题描述】:
我有一个名为 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 调用 Edit 操作,但该页面上的表单应该发布到相同的 uri 并调用不使用属性路由的操作。但是,使用基于属性的路由的操作被再次调用。为什么?
该表格随method="post" 一起提供。您知道为什么不使用基于约定的路线吗?感谢您的帮助。
编辑:我尝试在属性路由的新建和编辑操作前面添加[HttpGet]。结果是在发布表单时 ASP.NET 显示路由无效的错误。所以由于某些原因,基于约定的路由在控制器上不起作用。
【问题讨论】:
标签: c# asp.net asp.net-mvc-routing asp.net-mvc-5 attributerouting