【问题标题】:Is it possible to use attribute routing and convention based routing in the same controller?是否可以在同一个控制器中使用属性路由和基于约定的路由?
【发布时间】: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


    【解决方案1】:

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

    所以我为解决这个问题所做的就是将基于属性的路由添加到两个“无法访问”的操作方法中。这些方法的路由与同名动作的路由相同,但路由的名称不同(因为 route-names 必须是唯一的)。

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

    【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2014-02-12
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多