2012-02-14 1 views
0

Я использую ..Конкретная View (Asp.net MVC) для IPhone, Android

  • ASP.net MVC 4
  • 51Degrees.mobi
  • jQuery Mobile

По порцией этих технологий, я могу сделать дизайн пользовательского интерфейса моего веб-приложения хорош не только для настольных браузеров, но и для мобильных браузеров, не требуя от меня создания проектов отдельно.

Но когда речь заходит о более конкретных мобильных устройствах, я хотел бы назвать конкретный файл вида.
Таким образом, я использую ниже код в файле Global.asax.

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     //The Android view 
     DisplayModes.Modes.Insert(0, new DefaultDisplayMode("android") 
     {     
      ContextCondition = Context => Context.Request.Browser.Platform == "Android" 
     }); 

     //The iPhone view 
     DisplayModes.Modes.Insert(0, new DefaultDisplayMode("iphone") 
     { 
      ContextCondition = Context => Context.Request.Browser.MobileDeviceModel == "iPhone"     
     }); 

     //The mobile view 
     //This has a lower priority than the other two so will only be used by a mobile device 
     //that isn't Android or iPhone 
     DisplayModes.Modes.Insert(1, new DefaultDisplayMode("mobile") 
     { 
      ContextCondition = Context => Context.Request.Browser.IsMobileDevice     
     }); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

К сожалению, Android and IPhone specific view не загружаются каждый раз, когда я называю страницы с IPhone Emulator и Opera Mobile Emulator.

_Layout.cshtml [loaded from desktop based browser] 
_Layout.Android.cshtml [never loaded] 
_Layout.iPhone.cshtml [never loaded] 
_Layout.Mobile.cshtml [loaded from mobile based any browser including iphone, opera] 

Что я предполагаю, что что-то неправильно это я получаю только два файла, когда я скачал из 51Degrees.mobi с помощью пакета NuGet.

FiftyOne.Foundation.dll
51Degrees.mobi.config

Хотя я думаю, что я должен получить App_Data/Devices.dat, но я до сих пор получить только эти два файла из 51Degrees.mobi.

Может ли кто-нибудь, пожалуйста, дать мне предложение, как я мог назвать конкретное представление для IPhone и Android? Каждое предложение будет оценено по достоинству.

+1

Мой учебник ASP.NET MVC 4 Мобильные функции (http://www.asp.net/mvc/tutorials/aspnet-mvc-4 -mobile-features) работает с iPhone. – RickAndMSFT

+0

Спасибо @ Rick.Anderson-at-Microsoft.com –

ответ

5

Я только что сделал именно это и имел такое же поведение. Для начала пакет NuGet верен. Файл device.dat использовался для хранения в APP_Data, однако, если вы используете версию «lite», она теперь встроена в FiftyOne.Foundation.dll.

Чтобы исправить iPhone, это случайный тест. FiftyOne устанавливает MobileDeviceModel в «IPhone» (капитал I). Это работало с эмулятором iphone plum.

Для работы в андроиде кажется, что версия 'lite' не устанавливает платформу для Android. Легкое обходное решение - использовать строку UserAgent. то есть ContextCondition = Context => Context.GetOverriddenUserAgent(). Содержит («Android»)

Наконец, вы должны быть осторожны с тем, как вы вставляете эти элементы в коллекцию. Код выше вставляет Android правила вставляет правило IPhone (так андроид сейчас в положении 1 в сборе) Затем вставляет мобильное правило в положении 1 - поэтому коллекция заканчивает тем, как: IPhone Mobile Android

В качестве такого устройства Android всегда будет выбирать правило Mobile и никогда не отображать конкретную страницу браузера Android. Так что измените вставки на 0,1 & 2 в указанном порядке. Это дает тот же порядок, что и код, и все работает отлично.

Как в стороне, чтобы соответствовать ASP.Стиль инициализации Net MVC 4 Я отделил этот код от папки APP_Start в своем классе, т.е.

public class DeviceConfig 
{ 
    public static void RegisterDevices(IList<IDisplayMode> modes) 
    { 
     //The Android view 
     modes.Insert(0, new DefaultDisplayMode("android") 
     { 
      ContextCondition = Context => Context.GetOverriddenUserAgent().Contains("Android") 
     }); 

     //The iPhone view 
     modes.Insert(1, new DefaultDisplayMode("iphone") 
     { 
      ContextCondition = Context => Context.Request.Browser.MobileDeviceModel == "IPhone" 
     }); 

     //The mobile view 
     //This has a lower priority than the other two so will only be used by a mobile device 
     //that isn't Android or iPhone 
     modes.Insert(2, new DefaultDisplayMode("mobile") 
     { 
      ContextCondition = Context => Context.Request.Browser.IsMobileDevice 
     }); 
    } 
} 

, а затем в Global.asax.cs

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     DeviceConfig.RegisterDevices(DisplayModeProvider.Instance.Modes); 
    } 
+0

это сработало. Не забудьте назвать вид Android как «Android», капитал A –

+0

Не нужно добавлять «мобильный» вид, он уже в списке. Не нужно вставлять ни в какую другую позицию, кроме 0, когда вы добавляете Android, iPhone, WP8 и т. Д. – RickAndMSFT