【问题标题】:ASP.NET MVC Custom View Engine Not Being Called未调用 ASP.NET MVC 自定义视图引擎
【发布时间】:2009-10-23 15:34:25
【问题描述】:

我正在尝试实现一个自定义视图引擎来提供基于用户代理的移动视图。我正在关注 this blog post 的 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;
    }

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

【问题讨论】:

  • 您的网络服务器是否正确检测到客户端是手机?
  • 我们可以看看你的自定义视图引擎的实现吗?
  • 是的,在我的视图中添加了代码以打印用户代理并显示正确的字符串。但是,我相信这个问题与 MVC 一起忽略了我的视图引擎有关。我什至删除了检测手机的逻辑并硬编码了移动视图路径,但仍然以默认视图结束。
  • 对我最后的评论的补充:我们还能看到您用来将自己的视图引擎添加到视图引擎集合中的代码吗?
  • 我已将代码添加到我原来的问题中。感谢您对此进行调查。

标签: asp.net-mvc asp.net-mvc-2 viewengine


【解决方案1】:

这当然很尴尬:

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2011-12-04
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2010-10-13
相关资源
最近更新 更多