gpt4 book ai didi

c# - 是否可以在同一 Controller 中使用属性路由和基于约定的路由?

转载 作者:行者123 更新时间:2023-11-30 12:59:39 25 4
gpt4 key购买 nike

我有一个名为 HotelsController 的 Controller 来插入和编辑酒店。

它具有以下设置(为简单起见删除了方法实现):

[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 显示错误,指出路由无效。因此,由于某些原因,基于约定的路由在 Controller 上不起作用。

最佳答案

看来您不能在同一个 Controller 中同时使用这两种(基于属性和基于约定的)路由技术。

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

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

关于c# - 是否可以在同一 Controller 中使用属性路由和基于约定的路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24447753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com