如何实现依赖于不同于UI文化的标准的自定义资源提供程序?

时间:2012-06-05 13:25:26

标签: asp.net-mvc-3 resources

我正在研究.NET 4.0 MVC3 Web应用程序。该应用程序全部使用英语,允许用户填写有关不同地区的信息。为简单起见,我们假设我们有两个区域:美国西欧

现在在视图中我提供了一个字符串,让我们说项目开放,但是如果用户在区域美国上工作,我希望它能够阅读项目启动

当我考虑这个功能时,我会立即考虑不同地区的资源文件,但不依赖于UI文化。

有没有人有如何实现我想要的食谱?

也很好,如果将来我可以阅读,例如ExtendedDisplayAttribute(string displayName, int regionId)放置在我的ViewModel的属性上。

修改

我已经处于可以访问应该返回该区域字符串的帮助程序中的区域信息的阶段。现在我的资源文件有问题。我想创建具有故障转移机制的多个资源文件。我希望开箱即用,但ResourceManager不能用于读取resx文件。

是否有任何技术可以让我在没有某些无意义的resgen.exe的情况下从特定资源文件中读取值?

我也不想使用System.Resources.ResXResourceReader,因为它属于System.Windows.Forms.dll,这是一个网络应用。

1 个答案:

答案 0 :(得分:0)

以防有人想在将来做同样的事情。这篇文章非常有用:http://www.jelovic.com/articles/resources_in_visual_studio.htm

我使用的代码(VB)是:

<Extension()>
Public Function Resource(Of TModel)(ByVal htmlHelper As HtmlHelper(Of TModel), resourceKey As String) As MvcHtmlString
    Dim regionLocator As IRegionLocator = DependencyResolver.Current.GetService(GetType(IRegionLocator))

    Dim resources = New List(Of String)
    If Not String.IsNullOrEmpty(regionLocator.RegionName) Then
        resources.Add(String.Format("Website.Resources.{0}", regionLocator.RegionName))
    End If
    resources.Add("Website.Resources")

    Dim value = String.Empty
    For Each r In resources
        Dim rManager = New System.Resources.ResourceManager(r, System.Reflection.Assembly.GetExecutingAssembly())
        rManager.IgnoreCase = True

        Try
            value = rManager.GetString(resourceKey)
            If Not String.IsNullOrEmpty(value) Then
                Exit For
            End If
        Catch

        End Try
    Next

    Return New MvcHtmlString(value)
End Function