【问题标题】:ASP.NET MVC 5 Attribute Routing Failing To Resolve Route CorrectlyASP.NET MVC 5 属性路由无法正确解析路由
【发布时间】:2014-11-14 06:00:52
【问题描述】:

我的控制器中有以下路线。一个获取和两个发布操作。都具有相同的动作名称。如here 所述,使用 MultipleButton 属性区分两个发布操作:

[RoutePrefix("incidents")]
public sealed class IncidentsController : Controller
{    
    [HttpGet, Route("action/{id:int?}/{error?}")]
    public async Task<ActionResult> Action(int? id, string error = null)

    [HttpPost, Route("action"), ActionName("Action"), ValidateAntiForgeryToken]
    [MultipleButton(Name = "action", Argument = "Accept")]
    public async Task<ActionResult> ActionAccept(IncidentActionViewModel incident)

    [HttpPost, Route("action"), ActionName("Action"), ValidateAntiForgeryToken]
    [MultipleButton(Name = "action", Argument = "Reject")]
    public async Task<ActionResult> ActionReject(IncidentActionViewModel incident)
}

@Url.Action("Action", "Incidents", new { id = 10 })

上面的路线如下图所示。导航到此 URL 有效,但如果我将 'id' 参数从 Nullable 更改为 int,我开始收到错误。

/incidents/action?id=10

它应该呈现如下所示,如果我将 'id' 参数更改为 int 类型,我不应该得到错误:

/事件/行动/10

我做错了什么?

更新

这是我的路线注册详情:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapMvcAttributeRoutes();

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

【问题讨论】:

  • 能否请您分享您的路线注册详情。
  • 你遇到了什么错误?
  • 错误只是 404 Not Found。这很有意义,URL 解析不正确。

标签: c# .net asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing


【解决方案1】:

作为一种解决方法,我发现我可以使用命名路由而不是依赖 ASP.NET MVC 来使用控制器和操作名称来解析路由。所以我最终得到了以下代码:

[RoutePrefix("incidents")]
public sealed class IncidentsController : Controller
{    
    [HttpGet, Route("action/{id:int?}/{error?}", Name = "IncidentsGetAction")]
    public async Task<ActionResult> Action(int? id, string error = null)

    [HttpPost, Route("action", Name = "IncidentsPostActionAccept"), ActionName("Action"), ValidateAntiForgeryToken]
    [MultipleButton(Name = "action", Argument = "Accept")]
    public async Task<ActionResult> ActionAccept(IncidentActionViewModel incident)

    [HttpPost, Route("action", Name = "IncidentsPostActionReject"), ActionName("Action"), ValidateAntiForgeryToken]
    [MultipleButton(Name = "action", Argument = "Reject")]
    public async Task<ActionResult> ActionReject(IncidentActionViewModel incident)
}

// Generate a URL
@Url.RouteUrl("IncidentsGetAction", new { id = 10 })
// Generate a link to a URL
@Html.RouteLink("Link Text", "IncidentsGetAction", new { id = 10 })

这种方法性能更好,因为MVC不必解析URL,直接去即可。由于您明确说明要使用的路线,因此也更容易理解并减少出现错误的机会。

我个人已经将所有路由转换为命名路由,并放弃了使用控制器和动作解析路由。看看为什么会出现上述问题仍然很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2015-12-18
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多