18

在我看来,我想从该文件上的特定本地资源访问资源字符串。正如您从网络表单中知道的那样:

(string)GetLocalResource("Title");

无痛且光滑。框架处理从文化信息代码扩展 (.en-EN.resx) 获取的 .resx 文件。

在带有 Razore 视图的 MVC4 中这可能吗?如何?

我注意到我可以将Custom Tool.resx 文件上的属性设置为PublicResXFileCodeGenerator. 这样我就可以从视图中访问它。示例:我为 index.cshtml 用丹麦语和英语创建了 2 个资源文件。就像我在网络表单中一样。这是我希望我能写的(Custom Tool Name属性设置为“ViewResource”):

@ViewResource.Title

巴姆。如果当前文化是丹麦语,标题将是“Forside”,如果是英语,它将是“Home”。但相反,我得到的唯一选择是选择一个特定的文件。并从中选择所需的字符串:

@ViewResource.Index_cshtml_en-EN_resx.Title

那不是动态的。所以我想我可以制作一个扩展类,以某种方式取代 en-EN/da-DK。但是对于如此“简单”并且已经很好且容易集成到网络表单中的东西来说,这似乎确实是相对大量的工作。必须有另一种方式。当然,mvc 团队像其他一切一样为我们提供了一些智能机制 :)

4

6 回答 6

41

我使用了特殊的 .NET 文件夹App_LocalResources

以下是步骤

将文件添加.resx到该文件夹​​(即:Resource.resx、、Resource.es-ES.resx

右键单击每个.resx文件并选择properties并确保选择以下内容

Build Action: Embedded Resource 
Custom Tool: PublicResXFileCodeGenerator
Custom Tool Namespace: Resources

然后在您的视图中,您可以使用Resources名称空间来访问.resx文件中的文本

<h2>@Resources.Resource.Global_Title<h2>

@Resources因为那是您在 中提供的名称,Custom Tool Namespace因为.Resource那是.resx文件的名称

还要确保资源设置为Public

要从任何模型访问资源,只需添加一行

using Resources;  //<<-- This line

namespace Concordia_CRM.Models
{
    public class SolicitudDemo
    {
        [Required]
        [Display(Name = "SD_NombreEmpresa", ResourceType = typeof(Resource))]
        public string NombreEmpresa { get; set; }

...
}

更多细节可以在这篇文章中找到。

于 2015-06-22T15:38:41.650 回答
10

在 Visual Studio 顶部的资源设计器中,我们有一个带有标签的组合框:访问修饰符,通常将其设置为:内部,为了使其正常工作,请将其设置为:公共。

于 2014-08-13T18:44:45.050 回答
7

如果您创建一个名为 f.ex 的文件夹。“资源”并添加 2 个文件 Index.resx 和 Index.da-DK.resx,您应该能够在剃刀视图中像这样访问它们。

@Resources.Index.Title

然后根据当前的线程文化,它将从正确的文件中选择文本

于 2013-02-24T01:12:13.953 回答
3

terjetyl 让我走上了正确的道路,但我必须做一些“编码”(啊坚果)才能让它工作。我的设置是 Visual Studio 2013、MVC 5、Razor。

  1. 右键单击视图的包含文件夹,选择添加 > 添加 ASP.NET 文件夹 > App_LocalResources

  2. 在此处添加两个资源文件:Index.cshtml.resx 和 Index.cshtml。fr-FR .resx(假设您的视图称为“索引”并且您想要法语翻译)。Build Action=Content检查文件属性,并确保它们设置为Custom Tool=(blank)

  3. 双击 resx 文件并填充键/值

  4. 创建一个 HtmlHelper 扩展方法。


public static class HtmlExtensions
{
    public static MvcHtmlString Translate(this HtmlHelper htmlHelper, string key)
    {
        var viewPath = ((System.Web.Mvc.RazorView)htmlHelper.ViewContext.View).ViewPath;
        var culture = System.Threading.Thread.CurrentThread.CurrentCulture;

        var httpContext = htmlHelper.ViewContext.HttpContext;
        var val = (string)httpContext.GetLocalResourceObject(viewPath, key, culture);

        return MvcHtmlString.Create(val);
    }
}

  1. 在您的视图中使用扩展:

    <p>@Html.Translate("MyKey")</p>

解释一下,帮助程序获取视图的虚拟路径并将其传递给 HttpContext.GetLocalResourceObject(),后者决定使用哪个资源文件(并优雅地降级)。

最后一件事,确保它在您的 web.config 中:

<system.web>
    <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true" />
    ...

我试图让这个尽可能简单。但是,请注意,通过使用此示例,除 fr-FR(例如 fr-CA)之外的法语文化将默认为基本 resx。如果您希望它比这更聪明,则需要更多代码 - 我可以根据要求提供。

于 2015-03-27T17:23:39.233 回答
2

我从来没有让它工作。我最终使用了 .net 文件夹“App_LocalResources”。

于 2013-03-22T12:56:47.347 回答
0

我用 @MyApp.Resources.Resources.Title.

于 2016-02-23T14:09:30.917 回答