我试图暗示自定义视图引擎基于用户代理服务移动视图。我遵循Scott Hanselman的方法this blog post。ASP.NET MVC自定义视图引擎没有被调用
我已经从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;
}
而且这也没有工作。它仍然返回了默认视图。是的,应该由该语句找到的视图页面和母版页实际上存在。我非常难过,为什么这不起作用。
您的Web服务器是否正确检测到客户端是手机? –
我们可以看到您的自定义视图引擎的实现吗? –
是的,向我的视图添加代码以打印用户代理,并显示正确的字符串。但是,我认为这个问题与MVC忽略我的视图引擎有关。我甚至删除了检测手机的逻辑,并硬编码了移动视图路径,仍然以默认视图结束。 –