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
HttpBrowserCapabilitiesBaseclass) doesn’t recognize the Opera Mobile Emulator as a Mobile browser.You can check this in any controller action:
HttpContext.Request.Browser.IsMobileDevicewill returnfalsefor the Opera Mobile browser.Because the built in
DefaultDisplayModeuses the following method to check mobile browsers you need to register your customDisplayModewhich correctly recognizes Opera Mobile.To do this you need to add this to the Global.asax
Application_Start: