Реализация локализации .NET MVC (resourceprovider) работает неправильно - PullRequest
1 голос
/ 11 января 2010

Я сейчас внедряю локализованный сайт. Я создал собственный 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

Я сохранил ресурсы Global (Test) и Local (Products) в приведенном выше примере, если я прав?

Я использую эту реализацию ResourceHelpers ( ссылка ) (код ниже). Это должно позволить мне отображать ресурсы на основе следующего кода:

Глобальные ресурсы: Это работает (вывод: "Привет")

<% =Html.Resource("Common, Test") %>

Локальные ресурсы: вот проблема, это не работает, что происходит ??

<% =Html.Resource("Products") %>

Первый пример кода выдает «Hi», как и ожидалось. Однако второй пример кода вызывает исключение ( Объект ресурса с ключом «Продукты» не найден. ) (я пометил строку в коде ниже ~ строка 17). да , я звоню во вторую строку в "~ / Views / Products / Index.aspx"

Вот код помощника, который я использую:

<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

1 Ответ

1 голос
/ 04 февраля 2010

Оказывается, что ресурсы не сохранялись автоматически во время запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...