私は現在、ローカライズされたWebサイトを実装しています。データベースにリソースを保存するためのカスタムResourceProvider+Factoryを作成しました。これはすべて機能します。次のようにデータを保存しています。
resourceid | url (null) | type (null) | name | culture (null) | value
1 | NULL | Common | Test | NULL | Hi
2 | ~/Views/Products/Index.aspx | NULL | Products | NULL | Products
正しければ、上記のサンプルにグローバル(テスト)リソースとローカル(製品)リソースを保存しましたか?
私はResourceHelpersのこの実装を使用しています(リンク)(以下のコード)。これにより、次のコードに基づいてリソースを表示できるようになります。
グローバルリソース:これは機能します(出力: "Hi")
<% =Html.Resource("Common, Test") %>
ローカルリソース:ここに問題があります、これは機能しません、何が起こっているのですか?
<% =Html.Resource("Products") %>
最初のコードサンプルは、期待どおりに「Hi」を出力します。ただし、2番目のコードサンプルは例外をスローします(キー「Products」を持つリソースオブジェクトが見つかりませんでした。)(〜行17の下のコードで行をマークしました)。 はい、「〜/ Views / Products/Index.aspx」の2行目を呼び出しています
これが私が使用しているヘルパーコードです:
<System.Runtime.CompilerServices.Extension()> _
Public Function Resource(ByVal htmlhelper As HtmlHelper, ByVal expression As String, ByVal ParamArray args As Object()) As String
Dim virtualPath As String = GetVirtualPath(htmlhelper)
Return GetResourceString(htmlhelper.ViewContext.HttpContext, expression, virtualPath, args)
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function Resource(ByVal controller As Controller, ByVal expression As String, ByVal ParamArray args As Object()) As String
Return GetResourceString(controller.HttpContext, expression, "~/", args)
End Function
Private Function GetResourceString(ByVal httpContext As HttpContextBase, ByVal expression As String, ByVal virtualPath As String, ByVal args As Object()) As String
Dim context As New ExpressionBuilderContext(virtualPath)
Dim builder As New ResourceExpressionBuilder()
'The following line throws the exception
Dim fields As ResourceExpressionFields = DirectCast(builder.ParseExpression(expression, GetType(String), context), ResourceExpressionFields)
If Not String.IsNullOrEmpty(fields.ClassKey) Then
Return String.Format(DirectCast(httpContext.GetGlobalResourceObject(fields.ClassKey, fields.ResourceKey, CultureInfo.CurrentUICulture), String), args)
End If
Return String.Format(DirectCast(httpContext.GetLocalResourceObject(virtualPath, fields.ResourceKey, CultureInfo.CurrentUICulture), String), args)
End Function
Private Function GetVirtualPath(ByVal htmlhelper As HtmlHelper) As String
Dim virtualPath As String = Nothing
Dim controller As Controller = TryCast(htmlhelper.ViewContext.Controller, Controller)
If controller IsNot Nothing Then
'Dim result As ViewEngineResult = FindView(controller.ControllerContext, htmlhelper.ViewContext.ViewName)
Dim result As ViewEngineResult = FindView(controller.ControllerContext, GetViewName(htmlhelper.ViewContext.View))
Dim webFormView As WebFormView = TryCast(result.View, WebFormView)
If webFormView IsNot Nothing Then
virtualPath = webFormView.ViewPath
End If
End If
Return virtualPath
End Function
Private Function FindView(ByVal controllerContext As ControllerContext, ByVal viewName As String) As ViewEngineResult
' Result
Dim result As ViewEngineResult = Nothing
' Search only for WebFormViewEngine
Dim webFormViewEngine As WebFormViewEngine = Nothing
For Each viewEngine In ViewEngines.Engines
webFormViewEngine = TryCast(viewEngine, WebFormViewEngine)
If webFormViewEngine IsNot Nothing Then
Exit For
End If
Next
result = webFormViewEngine.FindView(controllerContext, viewName, "", False)
If result.View IsNot Nothing Then
result = webFormViewEngine.FindPartialView(controllerContext, viewName, False)
End If
' Return
Return result
End Function
Private Function GetViewName(ByVal view As IView) As String
Dim viewName As String = Nothing
If TypeOf view Is WebFormView Then
viewName = Path.GetFileNameWithoutExtension((DirectCast(view, WebFormView)).ViewPath)
End If
Return viewName
End Function