【问题标题】:Html extension in VB.NET MVC 3 applicationVB.NET MVC 3 应用程序中的 Html 扩展
【发布时间】:2011-06-17 18:45:12
【问题描述】:

我使用 VB.NET 实现了一个模块,以便在 MVC .NET 应用程序中处理本地化。

但是,当我尝试从我的角度调用扩展方法 LanguageSelectorLink 时,需要为 HtmlHelper 类型的第一个参数提供一些东西。在我在 Internet 上找到的所有 C# 示例中,从未提供过此参数,并且似乎可以正常工作。

@App_Code.LanguageSelectorLink(Nothing, "en-CA", "[English]", "English", Nothing)

我错过了一步吗?有人可以帮帮我吗?

导入 System.Threading

命名空间 App_Code

Public Module SwitchLanguageHelper
    <System.Runtime.CompilerServices.Extension()>
    Public Function LanguageUrl(ByVal helper As HtmlHelper,
                                       ByVal cultureName As String,
                                       Optional ByVal languageRouteName As String = "lang",
                                       Optional ByVal strictSelected As Boolean = False) As Language
        'Set the input language to lower
        cultureName = cultureName.ToLower()

        'retrieve the route values from the view context
        Dim routeValues = New RouteValueDictionary(helper.ViewContext.RouteData.Values)

        'copy the query strings into the route values to generate the link
        Dim queryString = helper.ViewContext.HttpContext.Request.QueryString

        For Each key In queryString
            If (Not (IsNothing(queryString(key))) And
               Not (String.IsNullOrWhiteSpace(queryString(key)))) Then
                If (routeValues.ContainsKey(key)) Then
                    routeValues(key) = queryString(key)
                Else
                    routeValues.Add(key, queryString(key))
                End If

            End If
        Next

        Dim actionName = routeValues("action").ToString()
        Dim controllerName = routeValues("controller").ToString()

        'set the language into route values
        routeValues(languageRouteName) = cultureName

        'generate the language specify url
        Dim urlHelper = New UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection)
        Dim url = urlHelper.RouteUrl("Localization", routeValues)

        'check whether the current thread ui culture is this language
        Dim current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower()
        Dim isSelected As Boolean

        If (strictSelected) Then
            current_lang_name = cultureName
        Else
            current_lang_name.StartsWith(cultureName)
        End If

        isSelected = current_lang_name

        Dim language As Language = New Language()

        language.Url = url
        language.ActionName = actionName
        language.ControllerName = controllerName
        language.RouteValues = routeValues
        language.IsSelected = isSelected

        Return language
    End Function

    <System.Runtime.CompilerServices.Extension()>
    Public Function LanguageSelectorLink(ByVal helper As HtmlHelper, ByVal cultureName As String, ByVal selectedText As String, ByVal unselectedText As String, ByVal htmlAttributes As IDictionary(Of String, Object), Optional ByVal languageRouteName As String = "lang", _
                                         Optional ByVal strictSelected As Boolean = False) As MvcHtmlString
        Dim language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected)
        Dim link = helper.RouteLink(If(language.IsSelected, selectedText, unselectedText), "Localization", language.RouteValues, htmlAttributes)

        Return link
    End Function


End Module

结束命名空间

【问题讨论】:

    标签: vb.net asp.net-mvc-3 html-helper


    【解决方案1】:

    您所做的是向HtmlHelper 类添加两个扩展方法。当您使用这些方法时,ByVal helper as HtmlHelper 将作为 HtmlHelper 类的实例隐式传递。

    这是您在视图中使用它们的方式:

    @Imports YourApplicationName.AppCode
    
    @Html.LanguageSelectorLink("en-CA", "[English]", "English", Nothing)
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2011-08-06
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多