Подтвердить что ты не робот

ASP.NET MVC 4 для мобильных устройств

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

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());
4b9b3361

Ответ 1

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)
});

Ответ 2

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

  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
             ))
             });  
    }