2009-10-23 3 views
2

Я пытаюсь внедрить настраиваемый механизм просмотра для обслуживания мобильных представлений на основе пользовательского агента. Я следую за приближением Скотта Гензеля от 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; 
    } 

И это тоже не сработало. Он по-прежнему возвращает представление по умолчанию. И да, страница просмотра и главная страница, которые должны быть найдены этим утверждением, действительно существуют. Я довольно тупой, почему это не работает.

+0

Правильно ли вы, что веб-сервер обнаруживает, что клиент является мобильным телефоном? –

+0

Можем ли мы увидеть вашу реализацию пользовательского механизма просмотра? –

+0

Да, добавлен код для моего просмотра, чтобы распечатать пользовательский агент, и он показывает правильную строку. Тем не менее, я верю, что проблема связана с тем, что MVC игнорирует мой механизм просмотра. Я даже удалил логику для обнаружения мобильного телефона и жестко закодировал путь к мобильному виду и все еще остался с представлением по умолчанию. –

ответ

2

Ну это, конечно, неловко:

Когда я писал мой взгляд двигатель я после блоге Скотта Hanselman (см моего оригинального поста на ссылку). Я применил мой класс движка взгляда, затем решил, что просто скопирую и вставив код Скотта в свой класс и изменив его по мере необходимости. Я случайно скопировал его код С определением класса в мой класс, создав вложенный класс. Поэтому мой механизм просмотра фактически не содержал переопределения для метода FindView, и, естественно, тот, который был вложенным классом, никогда не будет вызван!

Урок: при использовании кода, найденного в сети, не копируйте и не вставляйте! Всегда вводите его самостоятельно.

Спасибо всем, кто проверил этот вопрос и попытался мне помочь.

Сейчас я встану в углу стыда и смущения!

+0

:) Я рад, что вы решили проблему. –

+0

Вот обновленный/фиксированный ViewEngine для вас: http://www.hanselman.com/blog/NuGetPackageOfTheWeek10NewMobileViewEnginesForASPNETMVC3SpeccompatibleWithASPNETMVC4.aspx –