Vb.net MVC5中带属性路由的ActionLink
MVC5中的ActionLink有问题Vb.net MVC5中带属性路由的ActionLink,vb.net,asp.net-mvc-5,asp.net-mvc-routing,actionlink,attributerouting,Vb.net,Asp.net Mvc 5,Asp.net Mvc Routing,Actionlink,Attributerouting,MVC5中的ActionLink有问题 @Html.ActionLink("View Commissions", "/" + item.Id.ToString, "Commissions") @Html.ActionLink("View Commissions", "Index", "Commissions", New With {Key .payRollId = item.Id}, Nothing) 这两个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
获取:佣金/5
异步函数索引(ByVal payRollId为整数?)作为任务(ActionResult的)
如果没有(payRollId),则
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest)
如果结束
返回视图(等待…查询…。ToListSync)
端函数
这将成功处理第一个ActionLink的URL。第二个错误导致404错误。我没有任何其他路由属性或用于佣金的映射路由。根据这一点,第二个ActionLink应该创建成功处理请求的漂亮URL(没有查询字符串)
我错过了什么?如何获取第二个ActionLink以生成与RouteAttribute匹配的正确URL(Commissions/3
)
这将产生所需的路线:
<a href="~/Commissions/@item.Id">View Commissions</a>
我有一个局部解决方案。我使用了控制器代码,发现将RouteAttribute更改为
(注意末尾的?
)可以处理第二个URL
我还在研究如何使用第二个ActionLink生成一个漂亮的URL。如果我解决了这个问题,我会更新它。谢谢你的帮助。不幸的是,这会产生
http://mysite/Commissions/Index/3
它与RouteAttribute不匹配并导致404错误。也许我应该在控制器中创建另一个操作,但它似乎是多余的。如果我使用该选项,我只需将当前路线属性更改为包含索引。那么您想要的完整路线是什么?我以为你的控制员叫佣金控制员。不是吗?我想要的完整路线是http://mysite/Commissions/{payRollId}
其中payRollId
是一个整数。虽然操作是“索引”,但实际URL中忽略了它。该控制器不是CommissionController(它长得多,并且是使用脚手架选项自动生成的)。请编辑我的答案以适应非常规路线。就我所知,@Html.ActionLink助手对非常规(即基于属性的)路由没有帮助。可以想象,可以创建自己的助手来完成这项工作,但利用Razor通过~/处理基本路线并直接使用锚定标记可能会更快。
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 });
}
}