C# MVC4(FixedRazorViewEngine)找不到我的视图

C# MVC4(FixedRazorViewEngine)找不到我的视图,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我正试着根据我传来的一个鼻涕虫来交换观点。。。我可以验证slug和逻辑是否正确,但找不到我的观点: Global.asax.cs: ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new DeviceCapableViewEngine()); DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("mobile")

我正试着根据我传来的一个鼻涕虫来交换观点。。。我可以验证slug和逻辑是否正确,但找不到我的观点:

Global.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”。有什么我做错了吗?

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

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

因此,您的视图引擎将如下所示:

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"
   }; 
}

我已经写了一篇文章详细解释了这一点。

可能与此无关,但是:您是否检查了与结果相对应的文件,如“viewName.red.csthml”?检查结果的“SearchedLocations”以查看它是否在您期望的地方。。。