【发布时间】: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