2012-03-30 6 views
3

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

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

ответ

6

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

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

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

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

Edit для решения комментариев:

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

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

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

+0

мобильные устройства отличаются от веб-страниц. Наиболее заметно размер недвижимости на экране. Я думаю, что для любого заданного запроса, если есть веб-страница, я могу предоставить больше контента, чтобы заполнить экранную недвижимость, а затем то, что я могу сделать для мобильного устройства. MVC 4 предоставляет отличную функциональность для переключения представлений на основе пользовательского агента. Я могу иметь разные представления на основе разных интерфейсов, однако я застрял с одним и тем же контроллером для сбора разных наборов данных для разных представлений. Я не хочу «if (isMobileDevice)» в контроллере. Любые другие варианты? –

+0

извините, закончилось знаком в первом комментарии ... В любом случае, для данного запроса я хочу предоставить разные данные (то есть разные интерфейсы) на основе пользовательского агента. Как я могу эффективно это сделать в контроллере? –

+0

@TomSchreck, я внесла некоторые изменения, чтобы ответить на ваши комментарии. –

Смежные вопросы