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());
Ответы
Ответ 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
))
});
}