在MVC 5中使用属性路由的ActionLink

时间:2014-07-16 16:37:19

标签: vb.net asp.net-mvc-5 asp.net-mvc-routing actionlink attributerouting

我在使用MVC 5中的ActionLink时遇到了问题。

@Html.ActionLink("View Commissions", "/" + item.Id.ToString, "Commissions") 
@Html.ActionLink("View Commissions", "Index", "Commissions", New With {Key .payRollId = item.Id}, Nothing)

这两个ActionLink应该完成同样的事情,但我更愿意使用第二个。不幸的是,他们生成不同的URL。第一个创建http://mysite/Commissions/3。第二个创建http://mysite/Commissions?payRollId=3

在我的佣金控制器中,我有以下代码:

    ' GET: Commissions/5
    <Route("Commissions/{payRollId:min(1)}")>
    Async Function Index(ByVal payRollId As Integer?) As Task(Of ActionResult)
        If IsNothing(payRollId) Then
            Return New HttpStatusCodeResult(HttpStatusCode.BadRequest)
        End If

        Return View(Await ...query...).ToListAsync)
    End Function

这成功处理了第一个ActionLink的URL。第二个导致404错误。对于佣金,我没有任何其他RouteAttributes或映射路由。根据这个attribute routing article,第二个ActionLink应该创建成功处理请求的漂亮URL(没有查询字符串)。

我错过了什么?如何让第二个ActionLink生成正确的URL(Commissions/3)以匹配RouteAttribute?

2 个答案:

答案 0 :(得分:1)

修改

这应该产生所需的路线:

<a href="~/Commissions/@item.Id">View Commissions</a>

这假设您启用了基于属性的路由,如下所示:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

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

答案 1 :(得分:0)

我有部分解决方案。我使用控制器代码,发现将RouteAttribute更改为<Route("Commissions/{payRollId:min(1)?}")>(注意最后的?)允许它处理第二个URL。

我仍然在研究如何使用第二个ActionLink生成一个漂亮的URL。如果我解决这个问题,我会更新这个答案。