2012-05-08 2 views
2

Я хочу динамически изменять макет, основываясь на том, обращается ли пользователь к сайту с мобильного устройства или нет. У меня есть несколько вопросов по этому вопросу.Динамический макет для мобильных посетителей на ASP.NET MVC 3?

  1. Я хотел бы изменить макет, как только он будет определен, но перед визуализацией представления. То есть, есть какой-то крючок, который я могу использовать, где я могу изменить layout.cshtml на layout.mobile.cshtml «рекурсивно» для любых вложенных макетов, которые могут быть.

    Переоценка RazorViewEngineCreateView метод достаточно? Он принимает параметр masterPath, так что, возможно, я мог бы реализовать пользовательский RazorViewEngine и переопределить этот метод, правильно?

  2. Второй вопрос будет касаться обнаружения мобильного браузера. Мне неважно, что касается конкретных устройств. Я просто хочу отличить рабочий стол от мобильного. Что-то вроде WURFL необходимость в этом случае?

    Проверяет что-то вроде Request.Browser.ScreenPixelsWidth и ScreenPixelsHeigth нелепо? (Так как большинство я бы изменения будет использовать или не jQuery.mobile и это данные-атрибуты.

ответ

1

Эта функция встроена в ASP.NET MVC 4, так что вы получите его вне коробки.

Скотт Hansleman blogged о том, как вы могли бы добиться того же в ASP.NET MVC 3 и быть готовы к обновлению, поскольку NuGet он предложил это спецификация совместима с ASP.NET MVC 4.

0

Если вы можете, используя ASP MVC 4, как указал Дарин Димитров. Он поддерживает это из коробки.

Если вы застряли на MVC 3, вот как мы это делаем в нашем продукте:

1) Установка WURFL

2) Реализовать HttpCapabilitiesProvider, который вызывает WURFL и устраняет возможности устройства; в результате решены шапки. Обязательно добавьте свойство, называемое isMobileBrowser (wurfl предоставляет это)

3) Скажите .NET, чтобы использовать поставщик возможностей вместо стандартного HttpCapabilitiesBase.BrowserCapabilitiesProvider = new YourBrowserCapabilitiesProvider (_wurflManager);

4) Создайте CustomViewEngine (наследуйте RazorViewEngine). Переопределить FindPartialView & FindView. Они должны посмотреть на controlContext.RequestContext.HttpContext.Request.Browser.Capabilities ["isMobileBrowser"] и сопоставить соответствующее имя, например myView.cshtml.mobile. Вам нужно разрешить имя viewName и masterName.

4.1) Все еще в CustomViewEngine FindPartialView & FindView, поиск search ~/Views/{0}/{1} и ~/Views/Shared/{0}/{1}, где {0} - контроллер (controllerContext. RouteData.GetRequiredString ("controller")) и {1} - ваше отображаемое имя вида

4.2) Возврат возвращаемого нового ViewEngineResult (CreateView (controllerContext, viewPath, masterPath));

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