我们正在开发一个多个联盟合作伙伴将使用的电子商务系统。我们希望为每个合作伙伴定制门户网站,并能够适应页面之间内容的轻微变化。我们当前的技术是为每个合作伙伴创建.cshtml视图的副本,并对每个视图进行自定义。我们的设计师正在呻吟,因为这些观点可能只有轻微的措辞变化。我们只计划拥有10个左右的合作伙伴(由于我们行业的规模,它不能扩展到那个以上)所以一个完整的CMS系统是过度的。
我想使用resx文件管理每个合作伙伴的内容字符串,就像使用它们来管理不同语言的内容字符串一样。最终的结果是能够在视图中做这样的事情。
请通过@ Properties.Resources.PartnerCustomerServiceEmail
联系客户服务不必担心使用哪个资源文件来解析字符串PartnerCustomerServiceEmail。
提前感谢您的帮助
答案 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和诸如此类的东西来进行简单的品牌宣传。
这很简单,但我希望它能让你开始。