Asp.net mvc 动作链接将Id发送到不同的区域?
假设您有两个默认路由的区域(Asp.net mvc 动作链接将Id发送到不同的区域?,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,假设您有两个默认路由的区域(Area1和Area2)。每个区域都有一个家庭控制器 假设您有两个区域(Area1和Area2)具有默认区域感知路由。每个区域都有一个带索引的主控制器。在区域1的主页/索引视图中,您可以放置: @Html.ActionLink("Goto Area2", "Index", New With {.area = "Area2"}) @Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1"}) 在
Area1
和Area2
)。每个区域都有一个家庭控制器
假设您有两个区域(Area1
和Area2
)具有默认区域感知路由。每个区域都有一个带索引的主控制器。在区域1
的主页/索引视图中,您可以放置:
@Html.ActionLink("Goto Area2", "Index", New With {.area = "Area2"})
@Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1"})
在区域2的主视图/索引视图中,您可以放置:
@Html.ActionLink("Goto Area2", "Index", New With {.area = "Area2"})
@Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1"})
现在问题出现了:如果您转到/Area1/Home/Index/1
,操作链接会尝试将您发送到/Area2/Home/Index/1
。为什么?我怎样才能让它不把那个id传给第二个区域
谢谢你对这件事的建议,它已经被难倒好几天了。试试这个
@Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1", .id="" })
这是我使用的解决方案。它允许您在不手动传递ReouteValue的情况下指定区域,重要的是它将自动忽略您未指定的管线值。这可能(也可能确实)有错误,所以使用时要小心
Private ReadOnly ValuesToIgnore As String() = New String() {"action", "controller"}
<Extension()> _
Public Function AreaActionLink(ByVal htmlHelper As HtmlHelper,
ByVal linkText As String, Optional actionName As String = Nothing,
Optional controllerName As String = Nothing,
Optional ByVal areaName As String = Nothing,
Optional ByVal routeValues As Object = Nothing,
Optional htmlAttributes As Object = Nothing) As MvcHtmlString
Dim rvs = If(routeValues IsNot Nothing, New RouteValueDictionary(routeValues), New RouteValueDictionary())
Dim values = htmlHelper.ViewContext.RouteData.Values
If Not String.IsNullOrEmpty(areaName) Then _
rvs("area") = areaName
Dim implicitValues = values.Keys.Except(rvs.Keys)
For Each key In implicitValues.Except(ValuesToIgnore)
rvs(key) = Nothing
Next
Return htmlHelper.ActionLink(
linkText,
actionName,
controllerName,
rvs,
htmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
)
End Function
Private ReadOnly ValuesToIgnore As String()=New String(){“action”,“controller”}
_
公共功能区行动链接(ByVal htmlHelper As htmlHelper,
ByVal linkText作为字符串,可选actionName作为字符串=Nothing,
可选的controllerName As String=Nothing,
可选的ByVal areaName为String=Nothing,
可选ByVal routeValues As Object=Nothing,
可选htmlAttributes As Object=Nothing)作为MvcHtmlString
Dim rvs=If(routeValues不是空的,新RouteValueDictionary(routeValues),新RouteValueDictionary())
Dim values=htmlHelper.ViewContext.RouteData.values
如果不是String.IsNullOrEmpty(areaName),则_
rvs(“区域”)=区域名称
Dim implicitValues=values.Keys.EXPECT(rvs.Keys)
对于隐式Values.Exception中的每个键(ValuesToIgnore)
rvs(钥匙)=无
下一个
返回htmlHelper.ActionLink(
链接文本,
actionName,
控制器名称,
房车,
htmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
)
端函数
这确实管用,但我对解决方案的感觉好坏参半。在不需要路由信息的地方依赖路由信息是不干净的。假设您在操作中添加了一个新参数。。这意味着您需要更新操作链接以清除值?您可以随时使用标记生成器编写自己的扩展方法。但事实是,您明确地试图告诉链接对路由信息不使用任何值。默认情况下,它会将现有路由数据与您提供的新值合并。请注意,如果您尝试返回“根”区域,您将遇到相同的问题。如果你想链接到一个不在某个区域的控制器,你必须使用area=”“
fairpoint,但去根目录的问题至少更有意义。对我来说,当添加路线值时,这些是它应该使用的唯一值。我认为扩展方法是最好的方法。感谢您提供的信息,我对重载不太了解,但您可以检查RouteValueDictionary版本是否仅使用您提供的路由值。问题是,这看起来比=”
更糟糕。