我正在尝试使用自定义视图引擎来根据用户代理提供移动视图。我正在追踪Scott Hanselman的方法this blog post。
我从WebFormsViewEngine继承并以与Scott在博客中描述的方式相同的方式覆盖了FindView方法。
然后我在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 :(得分:2)
这当然是令人尴尬的:
当我编写视图引擎时,我正在关注Scott Hanselman的博客文章(请参阅我的原始帖子中的链接)。我查看了我的视图引擎类然后决定将Scott的代码复制并粘贴到我的类中并根据需要进行修改。我不小心将带有类定义的代码复制到我的类中,创建了一个嵌套类。因此,我的视图引擎实际上并没有包含FindView方法的覆盖,并且自然地,嵌套类中的那个永远不会被调用!
教训:使用在线发现的代码时不要复制粘贴!请务必自行输入。
感谢大家查看这个问题并试图帮助我。
我现在站在耻辱和尴尬的角落!