且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ASP.NET MVC 4移动功能

更新时间:2022-11-23 13:37:06

ASP.Net(实际上是 HttpBrowserCapabilitiesBase 类)不承认的Opera Mobile模拟器作为移动浏览器。

您可以在任何控制器动作检查: HttpContext.Request.Browser.IsMobileDevice 将返回的Opera移动浏览器。

由于内置的​​ DefaultDisplayMode 使用下面的方法来检查您需要注册您的自定义移动浏览器 DISPLAYMODE 这正确识别的Opera Mobile。

要做到这一点,你需要它添加到Global.asax中的Application_Start

  DisplayModeProvider.Instance.Modes.Insert(0,新DefaultDisplayMode(手机)
{
    ContextCondition =(上下文=> context.GetOverriddenUserAgent()
        .IndexOf(歌剧牧高笛,StringComparison.OrdinalIgnoreCase)GT; = 0)
});

I'm trying out the new ASP.NET MVC 4 Mobile Features. I made a simple app with just one controller (HomeController) and one view (Index). I also added a mobile version of the index view.

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

When launching the application in a desktop browser the regular view is shown as expected, however when I launch the application in the Opera Mobile Emulator as a Samsung Galaxy S, I still get the regular view and not the mobile version.

the user agent string sent from the emulator looks like this:

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

Any ideas on why this is not working?

Update Thanks to @nemesv I was able to solve the problem, here is my current solution, hopefully it will cover most mobile scenarios.

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

And i Global.asax

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

ASP.Net (actually the HttpBrowserCapabilitiesBase class) doesn't recognize the Opera Mobile Emulator as a Mobile browser.

You can check this in any controller action: HttpContext.Request.Browser.IsMobileDevice will return false for the Opera Mobile browser.

Because the built in DefaultDisplayMode uses the following method to check mobile browsers you need to register your custom DisplayMode which correctly recognizes Opera Mobile.

To do this you need to add this to the Global.asax Application_Start:

DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Mobile")
{
    ContextCondition = (context => context.GetOverriddenUserAgent()
        .IndexOf("Opera Mobi", StringComparison.OrdinalIgnoreCase) >= 0)
});