Specific View (Asp.net MVC) для iPhone, Android - PullRequest
0 голосов
/ 14 февраля 2012

Я использую ..

  • 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 и мобильного эмулятора Opera.

_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 Ответ

5 голосов
/ 07 июня 2012

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

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

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

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

Как таковое устройство Android всегда сначала выбирает правило для мобильных устройств и никогда не отображает страницу браузера, специфичную для Android. Поэтому измените Inserts на 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);
    }
...