asp.net mvc 4 режима отображения и контроллера - PullRequest
3 голосов
/ 30 марта 2012

Я поигрался с новой функциональностью ASP.net MVC 4 Display Mode, где вы можете добавить .Mobile на страницу отображения (Index.Mobile.cshtml), и она отобразит мобильную версию для мобильных устройств.Можно ли иметь разные контроллеры для разных пользовательских агентов?Что-то вроде HomeController.Mobile.cs?Я пробовал это, но это не работает.Компилятор хочет, чтобы HomeController.cs и HomeController.Mobile.cs были частичными.

Я знаю, что могу создать мобильную область и перенаправить весь мобильный трафик в эту область, чтобы у мобильных устройств были свои собственные контроллеры.Но я бы предпочел иметь что-то вроде HomeController.Mobile.cs, так что это обеспечивает более чистую кодовую базу.В противном случае при использовании режимов отображения ASP.net 4 мобильная версия и веб-версия страницы будут иметь одинаковую логику контроллера, которая не всегда необходима.Есть мысли о том, как это сделать?

1 Ответ

6 голосов
/ 30 марта 2012

Имена файлов ничего не значат для классов, поэтому я не уверен, что вы думаете о идее "HomeController.Mobile.cs".У вас не может быть двух классов HomeController с одним и тем же именем, так что это либо отдельные контроллеры / области / приложения, либо общий, как вы заметили.

Если вы придерживаетесь соглашения по умолчанию и имеете один и тот же контроллер, выможет отключить вашу логику в зависимости от типа устройства:

if (HttpContext.GetOverriddenBrowser().IsMobileDevice)
{
    //mobile specific logic
}

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

Правка для учета комментариев:

Я понимаю, что вы хотите;Мне пришлось сделать нечто подобное, когда я попытался сделать версию блога для jQuery Mobile.В принципе, есть 3 варианта, как я вижу:

  1. Контроллеры с единым набором логики, которая извлекает все данные для всех представлений.Каждое представление просто использует то, что ему нужно.
  2. Контроллеры с «if (isMobile)», который выполняет определенную логику и возвращает мобильное представление в случае мобильных устройств, а также выполняет другую логику и возвращает представление по умолчанию в других.
  3. Совершенно отдельная область или приложение для мобильных устройств (например, mobile.yourapp.com)

Похоже, вы не хотите № 2 или № 3, так что высчитается № 1?Узким местом в мобильных устройствах являются его ресурсы и сеть, поэтому я не буду слишком обеспокоен, если вашему серверу придется выполнять «дополнительную» работу, чтобы получить какой-то набор данных, который мобильное представление никогда не отображало.

...