ASP.NET MVC 4 для мобильных устройств - PullRequest
32 голосов
/ 08 марта 2012

Я опробую новые функции ASP.NET MVC 4 Mobile. Я сделал простое приложение с одним контроллером (HomeController) и одним представлением (индекс). Я также добавил мобильную версию представления индекса.

Views/Home/Index.cshtml
Views/Home/Index.Mobile.cshtml

При запуске приложения в настольном браузере отображается обычное представление, как и ожидалось, однако, когда я запускаю приложение в Opera Mobile Emulator как Samsung Galaxy S, я все равно получаю обычное представление, а не мобильная версия.

строка агента пользователя, отправленная из эмулятора, выглядит следующим образом:

Opera/9.80 (Windows NT 6.1; Opera Mobi/23731; U; en) Presto/2.9.201 Version/11.50

Есть идеи, почему это не работает?

Обновление Благодаря @nemesv я смог решить проблему, вот мое текущее решение, надеюсь, оно охватит большинство мобильных сценариев.

public class MobileDisplayMode : DefaultDisplayMode
{
    private readonly StringCollection _useragenStringPartialIdentifiers = new StringCollection
    {
        "Android",
        "Mobile",
        "Opera Mobi",
        "Samsung",
        "HTC",
        "Nokia",
        "Ericsson",
        "SonyEricsson",
        "iPhone"
    };

    public MobileDisplayMode() : base("Mobile")
    {
        ContextCondition = (context => IsMobile(context.GetOverriddenUserAgent()));
    }

    private bool IsMobile(string useragentString)
    {
        return _useragenStringPartialIdentifiers.Cast<string>()
                    .Any(val => useragentString.IndexOf(val, StringComparison.InvariantCultureIgnoreCase) >= 0);
    }
}

И я Global.asax

DisplayModeProvider.Instance.Modes.Insert(0, new MobileDisplayMode());

Ответы [ 2 ]

28 голосов
/ 08 марта 2012

ASP.Net (фактически класс HttpBrowserCapabilitiesBase) не распознает Opera Mobile Emulator как мобильный браузер.

Вы можете проверить это в любом действии контроллера: HttpContext.Request.Browser.IsMobileDevice вернет false для браузера Opera Mobile.

Поскольку встроенный DefaultDisplayMode использует следующий метод для проверки мобильных браузеров, вам необходимо зарегистрировать пользовательский DisplayMode, который правильно распознает Opera Mobile.

Для этого вам нужно добавить это в Global.asax Application_Start:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Mobile")
{
    ContextCondition = (context => context.GetOverriddenUserAgent()
        .IndexOf("Opera Mobi", StringComparison.OrdinalIgnoreCase) >= 0)
});
0 голосов
/ 16 декабря 2012

решение для всех мобильных телефонов без необходимости указывать все имена браузеров будет выглядеть так ...

  protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        DisplayModeProvider.Instance.Modes.Insert(0,
             new DefaultDisplayMode("Mobile")
             {
                 ContextCondition = (ctx => (
                     (ctx.GetOverriddenUserAgent() != null) && ctx.Request.Browser.IsMobileDevice
             ))
             });  
    }     
...