如何使用resx文件来管理门户网站内容

时间:2013-12-12 21:51:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4 resources

我们正在开发一个多个联盟合作伙伴将使用的电子商务系统。我们希望为每个合作伙伴定制门户网站,并能够适应页面之间内容的轻微变化。我们当前的技术是为每个合作伙伴创建.cshtml视图的副本,并对每个视图进行自定义。我们的设计师正在呻吟,因为这些观点可能只有轻微的措辞变化。我们只计划拥有10个左右的合作伙伴(由于我们行业的规模,它不能扩展到那个以上)所以一个完整的CMS系统是过度的。

我想使用resx文件管理每个合作伙伴的内容字符串,就像使用它们来管理不同语言的内容字符串一样。最终的结果是能够在视图中做这样的事情。

请通过@ Properties.Resources.PartnerCustomerServiceEmail

联系客户服务

不必担心使用哪个资源文件来解析字符串PartnerCustomerServiceEmail。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我想到的第一个想法是将有问题的资源文件名称保存到viewdata(或Session)中,并使用帮助程序获取值。

假设您有两个合作伙伴:Foo Logistics和Bar Solutions。拥有每个资源文件:PartnerFoo.resx和PartnerBar.resx。

在控制器中,将要使用的资源文件存储到ViewData中,如下所示:

public ActionResult About()
{
     ...
     ViewData["Resource"] = "MyMVCAppNamespace.Resources.PartnerFoo";
     return View();
}

也将命名空间包含在字符串中。

然后在帮助程序中编码以使用viewdata检索资源。

助手/ Helper.cs:

namespace MyMVCAppNamespace.MvcHtmlHelpers
{
    public static class HtmlHelpersExtensions
    {
        public static ResourceManager PartnerResource(this HtmlHelper helper)
        {
            // Get resource filename from viewdata
            string res = helper.ViewContext.ViewData["Resource"].ToString();
            // Load the resource from assembly
            ResourceManager resourceManager = new ResourceManager(res, Assembly.GetExecutingAssembly());

            return resourceManager;
        }
    }
}   

现在在视图中,我们将使用这个助手来检索我们想要写的字符串:

About.cshtml:

    @Html.PartnerResource().GetString("PartnerName")
    @Html.PartnerResource().GetString("PartnerCustomerServiceEmail")

将其呈现为:

Foo Logistics service@foologistics.com

或与PartnerBar

Bar Solutions service@barsolutions.com

我们确定在加载视图之前要使用的资源文件。然后在视图中,它根据存储在viewdata中的资源动态呈现。您甚至可以将资源文件名存储到web.config中,并根据需要从那里加载帮助器中的字符串。

更酷的是,如果您有本地化的resx文件,比如PartnerFoo.fi.resx然后使用不同的文化(在这种情况下为fi-FI),资源管理器会自动查找本地化版本。

您甚至可以通过在资源文件中存储图像URL和诸如此类的东西来进行简单的品牌宣传。

这很简单,但我希望它能让你开始。