是否有可能在同一个控制器中使用属性路由和基于约定的路由?

本文关键字:路由 于约定 约定 是否 控制器 同一个 属性 有可能 | 更新日期: 2023-09-27 18:10:25

我有一个名为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"。你知道为什么没有使用基于约定的路由吗?谢谢你的帮助。

Edit:我试图在属性路由的New和Edit动作前面添加[HttpGet]。结果是,在发布表单ASP。NET显示路由无效的错误。因此,由于某些原因,基于约定的路由不能在控制器上工作。

是否有可能在同一个控制器中使用属性路由和基于约定的路由?

似乎不能在同一个控制器中同时使用(基于属性的和基于约定的)路由技术。

所以我解决这个问题的方法是将基于属性的路由添加到两个"不可达"的路由中。行动的方法。这些方法的路由与同名操作的路由相同,但路由名不同(因为路由名必须是唯一的)。

[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)
    {
    }
}