ASP.NET MVC разделяет мобильные представления с использованием одних и тех же контроллеров - PullRequest
8 голосов
/ 22 июля 2011

Я работаю над новым проектом, использующим ASP.NET MVC 3 с Razor, и разрабатываю 2 разных представления одного и того же сайта, полную версию и мобильную версию. Каковы лучшие практики / подходы для использования одних и тех же контроллеров, но для отображения разных представлений на основе пользовательского агента? Должен ли я справиться с этим в контроллерах? Кажется, что было бы обременительно, избыточно и подвержено ошибкам, если операторы в каждом действии контроллера проверяют пользовательский агент, а затем возвращают другое представление в зависимости от их устройства.

1 Ответ

9 голосов
/ 16 декабря 2015

Теперь это можно выполнить с помощью встроенной функции ASP.NET MVC (начиная с версии 4), которая называется " DisplayModes "

По умолчанию ASP.NET MVC поставляется с двумя встроенными режимами отображения. Есть режим отображения по умолчанию, который отображает ваши «стандартные» представления, как это всегда было, и также есть общий «мобильный» режим отображения.

Это работает, определяя, является ли клиентское устройство мобильным браузером или нет (что само по себе определяется путем перехвата строки User-Agent клиентского устройства, поэтому не на 100% надежной). Если устройство определено как мобильное устройство, то фактическое представление MVC, которое отправляется клиенту, переопределяется, и вместо этого отображается и отправляется альтернативное представление. В случае включенного режима мобильного дисплея он настроен на просмотр вида с суффиксом .mobile.cshtml вместо .cshtml (как показано на скриншоте ниже)

Image of solution explorer showing mobile view file

Это позволяет вам проектировать совершенно разные представления, которые будут отправляться на мобильное устройство по сравнению с немобильным устройством, не требуя любых изменений в логике вашего контроллера, поэтому вам не нужно включать никакую условную логику там.

Если вам требуется более детальный контроль над точным представлением, отправляемым на клиентское устройство, вся функциональность режимов отображения настраивается и расширяется. Вы можете определить свои собственные режимы отображения (обычно выполняемые при запуске приложения), которые могут быть специфичными для данного браузера, данного устройства или любого произвольного определения, которое вы пожелаете. Все они основаны на строке агента пользователя, поступающей с клиентского устройства.

Рассмотрим следующий фрагмент кода, который показывает добавление 3 дополнительных пользовательских режимов отображения для Windows Phone, iPhone и Android в методе запуска приложения:

protected void Application_Start()
{   
    DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("WP")
    {
        ContextCondition = (context => context.GetOverriddenUserAgent().
            IndexOf("Windows Phone OS",StringComparison.OrdinalIgnoreCase) >= 0)
    });

    DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone")
    {
        ContextCondition = (context => context.GetOverriddenUserAgent().
            IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
    });

    DisplayModeProvider.Instance.Modes.Insert(2, new DefaultDisplayMode("Android")
    {
        ContextCondition = (context => context.GetOverriddenUserAgent().
            IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0)
    });
}

Каждому режиму отображения присваивается идентификатор и строка для сопоставления из строки агента пользователя, чтобы определить, следует ли использовать этот режим отображения. Если это так, DisplayModeProvider будет искать представление с тем же строковым суффиксом. (т.е. для режима отображения iPhone выше, мы ожидаем найти строку «iPhone» в любом месте строки пользовательского агента, и, если она существует, мы используем этот режим отображения, который отображает представления с суффиксом iphone.cshtml, а не .cshtml суффикс.

Подробнее об этой функции вы можете прочитать здесь: http://www.asp.net/mvc/overview/older-versions/aspnet-mvc-4-mobile-features в частности, в разделах «Переопределение видов, макетов и частичных видов» и «Видов, специфичных для браузера».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...