2011-06-17 13 views
1

MVC .NETアプリケーションでのローカライゼーションを処理するために、VB.NETを使用してモジュールを実装しました。VB.NET MVC 3アプリケーションのHTML拡張

しかし、私のビューから拡張メソッドLanguageSelectorLinkを呼び出そうとすると、HtmlHelper型の最初のパラメータに何かを提供する必要があります。私がインターネット上で見つけたすべての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クラスに2つの拡張メソッドを追加することです。 ByVal helper as HtmlHelperは、これらのメソッドを使用するときに暗黙的にHtmlHelperクラスのインスタンスとして渡されます。

これは、ビューでそれらを使用する方法である:

@Imports YourApplicationName.AppCode 

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

は、この情報がお役に立てば幸いです。

関連する問題