Я пытаюсь внедрить настраиваемый механизм просмотра для обслуживания мобильных представлений на основе пользовательского агента. Я следую за приближением Скотта Гензеля от this blog post.ASP.NET MVC Пользовательский механизм просмотра не называется
Я унаследовал от WebFormsViewEngine и переопределил метод 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;
}
И это тоже не сработало. Он по-прежнему возвращает представление по умолчанию. И да, страница просмотра и главная страница, которые должны быть найдены этим утверждением, действительно существуют. Я довольно тупой, почему это не работает.
Правильно ли вы, что веб-сервер обнаруживает, что клиент является мобильным телефоном? –
Можем ли мы увидеть вашу реализацию пользовательского механизма просмотра? –
Да, добавлен код для моего просмотра, чтобы распечатать пользовательский агент, и он показывает правильную строку. Тем не менее, я верю, что проблема связана с тем, что MVC игнорирует мой механизм просмотра. Я даже удалил логику для обнаружения мобильного телефона и жестко закодировал путь к мобильному виду и все еще остался с представлением по умолчанию. –