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版本是否仅使用您提供的路由值。问题是,这看起来比
=”
更糟糕。