Как получить текущий displaymode является мобильным в mvc4

Я разрабатываю мобильное веб-приложение. Мне нужно, чтобы текущий displaymode был мобильным в контроллере.

Моя проблема: у меня есть 2 partialview

/Views/Shared/ListItem.cshtml
/Views/Shared/ListItem.mobile.cshtml

при использовании PartialView ( "ListItem" ) это правильно работает. Но мне нужно поместить partialviews в подпапку

/Views/Shared/Modules/Post/ListItem.cshtml
/Views/Shared/Modules/Post/ListItem.mobile.cshtml

Когда я использую PartialView ( "~/Views/Shared/Modules/Post/ListItem.cshtml" ), это работает на рабочем столе. когда displaymode является мобильным, ListItem.mobile.cshtml не отображается.

Мой выбор

if( CurrentDisplayMode==Mobile){
  PartialView("~/Views/Shared/Modules/Post/ListItem.mobile.cshtml");
else
  PartialView("~/Views/Shared/Modules/Post/ListItem.cshtml");

Как получить CurrentDisplayMode? Как решить эту проблему?

Ответ 1

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

ControllerContext.DisplayMode не может использоваться, потому что он будет установлен после выполнения действия.

Итак, вы должны определить режим отображения на основе контекста (пользовательский агент, cookie, размер экрана и т.д.)

Здесь хороший трюк, который я нашел на форумах ASP.NEt, который позволит вам определить режим отображения, используя ту же логику, которая позже будет используемый каркасом:

public string GetDisplayModeId()
{
    foreach (var mode in DisplayModeProvider.Instance.Modes)
        if (mode.CanHandleContext(HttpContext))
            return mode.DisplayModeId;

    throw new Exception("No display mode could be found for the current context.");
}

Ответ 2

проверьте значение: HttpContext.GetOverriddenBrowser(). IsMobileDevice

Ответ 3

Я считаю, что MS хочет, чтобы вы использовали this:

controller.ControllerContext.DisplayMode

Это работает, но я обнаружил две серьезные проблемы (начиная с даты этого сообщения):

  • Единичное тестирование. Свойство DisplayMode нельзя установить вручную (выбрасывает NullReferenceException) и не может быть издевательством, потому что оно не является виртуальным.
  • Он не работает с MvcDonutCaching. DisplayMode просто возвращает NULL при запросе кэшированной части страницы.

Ответ 4

Самый лучший вариант, который у вас есть, - это проверить поле агента пользователя заголовка запроса, в котором вы можете прослушивать iPhone Android и т.д. Хотя это не даст вам размер экрана и не будет работать, если вы не слушаете телефоны Nokia или что-то в этом роде, это решение и позволяет вам ограничить то, что вы поддерживаете, как это делают большинство компаний.