【问题标题】:Action link sends Id to different area?操作链接将 ID 发送到不同的区域?
【发布时间】:2011-03-25 07:34:01
【问题描述】:

假设您有两个区域(Area1Area2)具有默认路由。每个区域都有一个 Home 控制器。

假设您有两个区域(Area1Area2)具有默认区域感知路由。这些区域中的每一个都有一个带有索引的 Home 控制器。在Area1 的主页/索引视图中,您放置:

@Html.ActionLink("Goto Area2", "Index", New With {.area = "Area2"})

然后在 Area2 的 Home/Index 视图中放置:

@Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1"})

现在的问题:如果您转到/Area1/Home/Index/1,操作链接会尝试将您发送到/Area2/Home/Index/1。为什么?以及如何让它不将该 id 传递到第二个区域?

感谢您对此事的任何建议,它已经被难住了好几天了。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    试试这个...

    @Html.ActionLink("Goto Area1", "Index", New With {.area = "Area1", .id="" })
    

    【讨论】:

    • 这确实有效,但我对解决方案的感觉很复杂。在不需要的地方依赖路由信息感觉并不干净。假设您向您的操作添加了一个新参数。这意味着您需要更新您的操作链接以清除该值?
    • 您始终可以使用标签生成器编写自己的扩展方法。但事实是您明确地试图告诉链接不要为路由信息使用任何值。默认情况下,它将现有路由数据与您提供的新值合并。
    • 请注意,如果您尝试返回“根”区域,您将遇到同样的问题。如果您想链接到不在区域中的控制器,则必须使用Area=""
    • 公平点,但至少去根的问题更有意义。对我来说,当您添加路由值时,感觉就像是它应该使用的唯一值。我想扩展方法是最好的方法。感谢您的信息
    • 我对过载了解不多,但您可以检查 RouteValueDictionary 版本是否仅使用您提供的路由值。事情是这看起来比="" 更糟糕。
    【解决方案2】:

    这是我使用的解决方案。它允许您在不手动传递 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多