0

我们当前的项目正在利用在线找到的以下代码片段根据需要将用户引导到移动视图:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Mobile")
    {
        ContextCondition = (context => RequirementsHelper.BrowserIsMobile(context.GetOverriddenUserAgent()))
    });

它允许我们根据用户代理字符串轻松地将用户引导到 index.cshtml 或 index.mobile.cshtml。到目前为止,一切都很好。

扩展这个想法,我很想实现一个基于 DisplayModeProvider 的本地化引擎(因为我们网站的不同版本看起来有很大不同,但功能几乎相同。)

所以我最初的快速测试是创建以下方法:

protected void DisplayNZSkin()
{
    System.Web.WebPages.DisplayModeProvider.Instance.Modes.Add(new System.Web.WebPages.DefaultDisplayMode("NZ")
    {
        ContextCondition = (context => true)
    });
}

当我确定要显示 NZ 皮肤时,我可以调用它(不幸的是,它依赖于一些数据库调用)。这个想法是,当它被调用时,它会强制渲染 index.nz.cshtml。

这是个坏主意。仅在我的控制器中存在此方法(未调用),就使所有页面都呈现其 .nz 版本。单步执行,表明代码总是被执行。(context => true)在每个页面调用中都会调用该函数。

那里发生了什么事?

4

1 回答 1

0

我有几乎相同的想法,所以我会放上我的版本,让我们看看它是否能解决你的问题。

我从这篇文章开始
http://www.codeproject.com/Articles/576315/LocalizeplusyourplusMVCplusappplusbasedplusonplusa

但是将其更改为使用它,因为过滤器在模型绑定之后。

public class ExtendedControllerFactory:DefaultControllerFactory
{
    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(GetCultureFromURLOrAnythingElse());
        Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(GetCultureFromURLOrAnythingElse());
        return base.GetControllerInstance(requestContext, controllerType);
    }

这样 global.asax 应该有这个

    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new ExtendedControllerFactory());

    System.Web.WebPages.DisplayModeProvider.Instance.Modes.Insert(0, new System.Web.WebPages.DefaultDisplayMode("EN")
        {
            ContextCondition = context => Thread.CurrentThread.CurrentCulture.Name.Equals("en-US", StringComparison.CurrentCultureIgnoreCase)
        });
    System.Web.WebPages.DisplayModeProvider.Instance.Modes.Insert(0, new System.Web.WebPages.DefaultDisplayMode("BR")
        {
            ContextCondition = context => Thread.CurrentThread.CurrentCulture.Name.Equals("pt-BR", StringComparison.CurrentCultureIgnoreCase)
        });

我认为这应该做你想做的,但我从来没有在生产中尝试过。

于 2013-09-04T18:21:37.030 回答