我试图实现一个自定义视图引擎来基于用户代理提供移动视图。我正在关注这篇博文中的 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;
}
这也不起作用。它仍然返回默认视图。是的,该语句应该找到的视图页面和母版页确实存在。我很困惑为什么这不起作用。