2014-09-19 103 views
0

我的控制器中有以下路由。一个获取和两个发布操作。所有人都有相同的行动名称。两个后操作使用的是MultipleButton属性区分所解释hereASP.NET MVC 5属性路由未能正确解决路由问题

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

上述路线获取呈现如下所示。导航到这个网址的作品,但如果我把'空白'参数从'空'改为int我开始得到错误。 ?

/事件/动作ID = 10

应该呈现如下图所示,如果我改变了 '身份证' 参数为int类型我不应该得到的错误:

/事故/行动/ 10

我在做什么错?

UPDATE

这里是我的路线报名详情:

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

routes.MapMvcAttributeRoutes(); 

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

您可以请您分享您的路线注册详情。 – 2014-09-19 19:19:36

+0

你得到什么错误? – 2014-09-19 21:10:41

+0

错误只是404未找到。这很有道理,URL正在被错误地解析。 – 2014-09-23 11:51:12

回答

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更好的性能,它可以直接到它。当你明确你想要使用的路线时,它也容易理解和减少错误发生的可能性。

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