0

我正在尝试根据我传入的 slug 切换视图...我可以验证 slug 并且逻辑是正确的,但找不到我的视图:

全球.asax.cs:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new DeviceCapableViewEngine());

            DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")
            {
                ContextCondition = Context => Context.Request.Browser["IsMobile"] == "True"
                                                && Context.Request.Browser["IsTablet"] == "False"
            });

            DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("")
            {
                ContextCondition = Context => Context.Request.Browser["IsMobile"] == "False"
                                                || Context.Request.Browser["IsTablet"] == "True"
            });

DeviceCapableViewEngine:

   public class DeviceCapableViewEngine : FixedRazorViewEngine
    {
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            ViewEngineResult result = null;
        switch (ThemeContext.GetTheme())
        {
            case "Blue":
                result = base.FindView(controllerContext, string.Format("{0}.{1}", viewName, "blue"), masterName, useCache);
                break;
            case "Red":
                result = base.FindView(controllerContext, string.Format("{0}.{1}", viewName, "red"), masterName, useCache);
                break;
        }

        if (result == null || result.View == null)
            result = base.FindView(controllerContext, viewName, masterName, useCache);

        return result;
    }

我有一个相当标准的设置,我可以确认“蓝色”或“红色”断点被击中。如果它们是,我不希望 MVC 注入“.mobile”......相反,我希望它是“viewName.red”......但似乎使用我的 DDR,它总是会尝试使用碱基调用,这是真的吗?

无论如何,它都会返回“viewName.mobile”。有什么我做错了吗?

4

1 回答 1

0

我有同样的问题(原帖)。当您调用 base.FindView 时,您将 controllerContext 作为参数之一传递。在那里,viewEngine 实际上会查看上下文,如果 Mobile 标志设置为 true,它将尝试在 [viewname] 之前查找 [viewname].mobile。

我想出的解决方案(老实说,IMO 更优雅)是根据设备将您的视图放在单独的文件夹中,然后在您的自定义视图引擎中,更改应该查找视图的位置。这既可以根据设备提供视图的逻辑分离,也可以简化视图引擎。

所以你的视图引擎看起来像这样:

string myViewName = viewName;

switch (ThemeContext.GetTheme())
{
    case "Blue":
        myViewName += ".blue";
        break;
    case "Red":
        myViewName += ".red";                
        break;
}

if (mobileViewShouldNotBeDisplayed)
{

   ViewLocationFormats = new[]
   {
        "~/Views/{1}/{0}.cshtml"
   }; 
}
if (mobileViewShouldBeDisplayed)
{

   ViewLocationFormats = new[]
   {
        "~/Views/{1}/Mobile/{0}.cshtml"
   }; 
}

我写了一篇博文,详细解释了这一点。

于 2013-09-30T04:24:45.983 回答