Как получить текущий 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 или что-то в этом роде, это решение и позволяет вам ограничить то, что вы поддерживаете, как это делают большинство компаний.