2009-10-23 59 views
2

我试图暗示自定义视图引擎基于用户代理服务移动视图。我遵循Scott Hanselman的方法this blog postASP.NET MVC自定义视图引擎没有被调用

我已经从WebFormsViewEngine继承并重写FindView方法,就像Scott在他的博客中描述的一样。

然后,我添加了几行到我的Global.asax Application_Start方法来清除视图引擎集合并添加我的视图引擎的新实例。

经过一些测试后,似乎MVC忽略了我的视图引擎。当它无法根据浏览器的用户代理找到我的自定义视图时,我使用硬编码自定义路径来追加到视图,并且它仍然设法回到默认视图。我在我的FindView方法中设置了一个断点,果然,它并没有被调用。

如何让我的自定义视图引擎正常工作?任何帮助都感激不尽。

我的视图引擎是这样的:

public class MyViewEngine: WebFormsViewEngine 
{ 
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     ViewEngineResult result = null; 

     //Serve a special view for iPhones 
     if (UserAgentIs(controllerContext, "iPhone")) 
     { 
       result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache); 
     } 

     //If no special view is found, fall back to the default view 
     if (result == null || result.View == null) 
     { 
       result = base.FindView(controllerContext, viewName, masterName, useCache); 
     } 

     return result; 
    } 

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest) 
    { 
     return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0); 
    } 
} 

而且在我的Global.asax:

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new MyViewEngine()); 
} 

当此设置没有工作,我甚至试图简化我FindView方法如下:

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     ViewEngineResult result = null; 
     result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache); 
     return result; 
    } 

而且这也没有工作。它仍然返回了默认视图。是的,应该由该语句找到的视图页面和母版页实际上存在。我非常难过,为什么这不起作用。

+0

您的Web服务器是否正确检测到客户端是手机? –

+0

我们可以看到您的自定义视图引擎的实现吗? –

+0

是的,向我的视图添加代码以打印用户代理,并显示正确的字符串。但是,我认为这个问题与MVC忽略我的视图引擎有关。我甚至删除了检测手机的逻辑,并硬编码了移动视图路径,仍然以默认视图结束。 –

回答

2

嗯,这肯定是尴尬:

当我写我的视图引擎,我从以下斯科特Hanselman的博客文章(见我的原帖中的链接)。我对我的视图引擎类进行了挖掘,然后决定将Scott的代码复制并粘贴到我的类中,并根据需要进行修改。我不小心将他的代码与类定义复制到我的类中,创建一个嵌套类。因此,我的视图引擎实际上并不包含对FindView方法的覆盖,并且自然不会调用嵌套类中的一个!

经验教训:使用在线找到的代码时不要复制和粘贴!始终自己输入。

感谢大家谁检查这个问题,并试图帮助我。

我会站在现在的耻辱和尴尬的角落!

+0

:)我很高兴你解决了这个问题。 –

+0

下面是为您更新/修复的ViewEngine:http://www.hanselman.com/blog/NuGetPackageOfTheWeek10NewMobileViewEnginesForASPNETMVC3SpeccompatibleWithASPNETMVC4.aspx –

相关问题