Asp.net mvc .NET MVC本地化(resourceprovider)实现工作不正常

Asp.net mvc .NET MVC本地化(resourceprovider)实现工作不正常,asp.net-mvc,vb.net,localization,resources,resourceproviderfactory,Asp.net Mvc,Vb.net,Localization,Resources,Resourceproviderfactory,我目前正在实施一个本地化的网站。我创建了一个自定义ResourceProvider+工厂,用于在数据库中存储资源。这一切正常,我将数据存储如下: resourceid | url (null) | type (null) | name | culture (null) | value 1 | NULL | Common | Test | NULL | H

我目前正在实施一个本地化的网站。我创建了一个自定义ResourceProvider+工厂,用于在数据库中存储资源。这一切正常,我将数据存储如下:

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”。但是,第二个代码示例引发了一个异常(未找到具有键“Products”的资源对象。)(我已在代码中标记了第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
_
公共函数资源(ByVal htmlhelper作为htmlhelper,ByVal表达式作为String,ByVal ParamArray args作为Object())作为String
Dim virtualPath As String=GetVirtualPath(htmlhelper)
返回GetResourceString(htmlhelper.ViewContext.HttpContext,表达式,virtualPath,args)
端函数
_
公共函数资源(ByVal控制器作为控制器,ByVal表达式作为字符串,ByVal ParamArray args作为对象())作为字符串
返回GetResourceString(controller.HttpContext,表达式“~/”,args)
端函数
私有函数GetResourceString(ByVal httpContext作为HttpContextBase,ByVal表达式作为String,ByVal virtualPath作为String,ByVal args作为Object())作为String
Dim上下文作为新的ExpressionBuilderContext(virtualPath)
Dim builder作为新的ResourceExpressionBuilder()
'下一行抛出异常
将字段设置为ResourceExpressionFields=DirectCast(builder.ParseExpression(表达式、GetType(字符串)、上下文)、ResourceExpressionFields)
如果不是String.IsNullOrEmpty(fields.ClassKey),则
返回String.Format(DirectCast(httpContext.GetGlobalResourceObject(fields.ClassKey,fields.ResourceKey,CultureInfo.CurrentUICulture),字符串),args)
如果结束
返回String.Format(DirectCast(httpContext.GetLocalResourceObject(virtualPath,fields.ResourceKey,CultureInfo.CurrentUICulture),String),args)
端函数
私有函数GetVirtualPath(ByVal htmlhelper作为htmlhelper)作为字符串
Dim virtualPath作为字符串=无
Dim控制器作为控制器=TryCast(htmlhelper.ViewContext.controller,controller)
如果控制器不是空的,那么
'作为ViewEngineResult=FindView的Dim结果(controller.ControllerContext,htmlhelper.ViewContext.ViewName)
将结果调整为ViewEngineResult=FindView(controller.ControllerContext,GetViewName(htmlhelper.ViewContext.View))
将webFormView调整为webFormView=TryCast(result.View,webFormView)
如果webFormView不是空的,那么
virtualPath=webFormView.ViewPath
如果结束
如果结束
返回虚拟路径
端函数
私有函数FindView(ByVal controllerContext作为controllerContext,ByVal viewName作为字符串)作为ViewEngineResult
"结果,
将结果变暗为ViewEngineResult=Nothing
'仅搜索WebFormViewEngine
将webFormViewEngine调整为webFormViewEngine=无
对于ViewEngines中的每个viewEngine。引擎
webFormViewEngine=TryCast(viewEngine,webFormViewEngine)
如果webFormViewEngine不是空的,那么
退出
如果结束
下一个
结果=webFormViewEngine.FindView(controllerContext,viewName,“,False)
如果result.View不是空的,那么
结果=webFormViewEngine.FindPartialView(controllerContext,viewName,False)
如果结束
“回来
返回结果
端函数
私有函数GetViewName(ByVal视图作为IView)作为字符串
Dim viewName作为字符串=无
如果视图类型为WebFormView,则
viewName=Path.GetFileName WithOutExtension((DirectCast(视图,WebFormView)).ViewPath)
如果结束
返回视图名
端函数

结果表明资源在请求过程中没有自动保存。

结果表明资源在请求过程中没有自动保存

<% =Html.Resource("Products") %>
<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