2011-06-17 74 views
1

爲了在MVC .NET應用程序中處理本地化,我使用VB.NET實現了一個模塊。在VB.NET MVC 3應用程序中的HTML擴展

但是,當我嘗試從我的視圖中調用擴展方法LanguageSelectorLink時,它需要爲類型爲HtmlHelper的第一個參數提供某些內容。在Internet上找到的所有C#示例中,從未提供此參數,它似乎工作正常。

@ App_Code.LanguageSelectorLink(沒什麼, 「EN-CA」, 「[英]」, 「英語」,爲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 

末命名空間

回答

0

你所做的一切是添加了兩個擴展方法的HtmlHelper類。當您使用這些方法時,ByVal helper as HtmlHelper作爲HtmlHelper類的實例隱式傳遞。

這是你如何在視圖中使用它們:

@Imports YourApplicationName.AppCode 

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

希望這有助於。

相關問題