ASP.NET MVC 5属性路由无法正确解析路由

时间:2014-09-19 15:24:14

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

我的控制器中有以下路线。一个Get和两个post动作。所有人都有相同的行动名称。使用MultipleButton属性区分两个后置操作,如here所述:

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

上面的路线呈现如下所示。导航到此网址有效,但如果我更改了&#39; id&#39;参数从Nullable到int我开始得到错误。

  

/事件/动作?ID = 10

它应该呈现如下所示,如果我更改了&#39; id&#39;我不应该出错。输入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 });

1 个答案:

答案 0 :(得分:0)

作为解决方法,我发现我可以使用命名路由而不是依赖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,它可以直接转到它。当您明确了解要使用的路线时,它也更容易理解并减少出现错误的可能性。

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