Как я изменил бы ASP.NET представления MVC на основе типа устройства?

Можно показать только время последнего обновления данных. Используйте одно из этого:

  1. Мера DAX MyNow = СЕГОДНЯ () возвращает единственную дату

  2. PowerQuery MyNow = DateTime. LocalNow () возвращает таблицу с одной строкой & седло

27
задан Mattio 7 September 2009 в 02:46
поделиться

3 ответа

Обновление : в этом решении есть небольшая ошибка. Платформа MVC вызовет FindView / FindPartialView дважды: один раз с useCache = true , и если это не вернет результат, один раз с useCache = false . Поскольку существует только один кеш для всех типов представлений, мобильные пользователи могут в конечном итоге увидеть представления рабочего стола, если первым появится браузер рабочего стола.

Для тех, кто заинтересован в использовании пользовательских механизмов представления для решения этой проблемы, Скотт Хансельман обновил свое решение здесь:

http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

(Извинения за угон ответа, я просто не хочу, чтобы кто-то еще прошел через это! )

Отредактировано roufamatic (2010-11-17)


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

Затем придумайте стратегию того, как вы хотите организовать свои представления в папке Views. Я предпочитаю оставить настольную версию в корне, а затем иметь папку Mobile. Например, папка главного экрана будет выглядеть так:

  • Домашняя страница Используя этот файл, вы можете настроить таргетинг на любое устройство, которое вы хотите поддерживать, без необходимости знать особенности того, что эти устройства отправляют в своих заголовках. Этот файл уже сделал всю работу за вас. Затем вы используете свойство Request.Browser, чтобы настроить, какое представление вы хотите вернуть.

    Затем придумайте стратегию того, как вы хотите организовать свои представления в папке Views. Я предпочитаю оставить настольную версию в корне, а затем иметь папку Mobile. Например, папка главного экрана будет выглядеть так:

    • Домашняя страница Используя этот файл, вы можете настроить таргетинг на любое устройство, которое хотите поддерживать, без необходимости знать особенности того, что эти устройства отправляют в своих заголовках. Этот файл уже сделал всю работу за вас. Затем вы используете свойство Request.Browser, чтобы настроить, какое представление вы хотите вернуть.

      Затем придумайте стратегию того, как вы хотите организовать свои представления в папке Views. Я предпочитаю оставить настольную версию в корне, а затем иметь папку Mobile. Например, папка главного экрана будет выглядеть так:

      • Домашняя страница
        • Мобильный
          • iPhone
            • Index.aspx
          • BlackBerry
            • Index.aspx
        • Index.aspx

      Я не согласен с @Mehrdad по поводу использования настраиваемого механизма просмотра. Механизм просмотра служит более чем одной цели, и одна из этих целей - поиск представлений для контроллера. Вы делаете это путем переопределения метода FindView. В этом методе вы можете проверить, где найти представление. После того, как вы узнаете, какое устройство использует ваш сайт, вы можете использовать стратегию, которую вы придумали для организации ваших представлений, чтобы вернуть представление для этого устройства.

      public class CustomViewEngine : WebFormViewEngine
      {
          public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
          {
              // Logic for finding views in your project using your strategy for organizing your views under the Views folder.
              ViewEngineResult result = null;
              var request = controllerContext.HttpContext.Request;
      
              // iPhone Detection
              if (request.UserAgent.IndexOf("iPhone",
         StringComparison.OrdinalIgnoreCase) > 0)
              {
                  result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
              }
      
              // Blackberry Detection
              if (request.UserAgent.IndexOf("BlackBerry",
         StringComparison.OrdinalIgnoreCase) > 0)
              {
                  result = base.FindView(controllerContext, "Mobile/BlackBerry/" + viewName, masterName, useCache);
              }
      
              // Default Mobile
              if (request.Browser.IsMobileDevice)
              {
                  result = base.FindView(controllerContext, "Mobile/" + viewName, masterName, useCache);
              }
      
              // Desktop
              if (result == null || result.View == null)
              {
                  result = base.FindView(controllerContext, viewName, masterName, useCache);
              }
      
              return result;
          }
      }
      

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

      Если вы решите поместить логику в свой контроллер вместо создания механизма представления. Лучшим подходом было бы создать собственный ActionFilterAttribute , которым вы можете украсить свой контроллер. Затем переопределите метод OnActionExecuted , чтобы определить, какое устройство просматривает ваш сайт. Вы можете проверить сообщение в блоге о том, как это сделать. В сообщении также есть несколько хороших ссылок на несколько видеороликов Mix по этой теме.

21
ответ дан 28 November 2019 в 05:46
поделиться

В шаблоне модель-представление-контроллер именно контроллер выбирает представление, поэтому неплохо добавить оператор if и вернуть соответствующее представление. Вы можете инкапсулировать оператор if в метод и вызвать его:

return AdaptedView(Browser.IsMobileDevice, "MyView.aspx", model);

В качестве альтернативы вы можете создать механизм представления, который динамически выполняет представление в зависимости от того, мобильно оно или нет. Я не сторонник такого подхода, так как считаю, что за это должен отвечать контроллер. Например, если вы просматриваете страницы на iPhone, вы можете вместо этого увидеть полную версию для ПК. В первом подходе вы передаете соответствующий логический флаг, но во втором все становится более сложным.

2
ответ дан 28 November 2019 в 05:46
поделиться

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

Альтернативой было бы обернуть логику контроллера в отдельную dll, а затем иметь другие контроллеры / пути для мобильной версии. Если обычный контроллер получает запрос от мобильного устройства, вы можете перенаправить его в свою мобильную область, которая содержит все ваши мобильные контроллеры, использующие логику общего контроллера. Это решение также позволит вам выполнять «настройки», специфичные для мобильных контроллеров, и не повлиять на работу обычных контроллеров.

0
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: