2

我试图实现一个自定义视图引擎来基于用户代理提供移动视图。我正在关注这篇博文中的 Scott Hanselman 的方法。

我继承了 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;
    }

这也不起作用。它仍然返回默认视图。是的,该语句应该找到的视图页面和母版页确实存在。我很困惑为什么这不起作用。

4

1 回答 1

2

好吧,这当然很尴尬:

当我编写视图引擎时,我正在关注 Scott Hanselman 的博客文章(请参阅我的原始文章以获取链接)。我删除了视图引擎类,然后决定将 Scott 的代码复制并粘贴到我的类中,并根据需要进行修改。我不小心将他的代码与类定义复制到我的类中,创建了一个嵌套类。因此,我的视图引擎实际上并没有包含 FindView 方法的覆盖,并且嵌套类中的那个自然不会被调用!

教训:使用网上找到的代码时不要复制粘贴!始终自己输入。

感谢所有检查此问题并试图帮助我的人。

我现在就站在羞耻和尴尬的角落里!

于 2009-10-23T16:59:26.333 回答