Mobile Specific Views / Device Detection

放肆的年华 提交于 2021-02-08 13:53:12

问题


In the .NET Core docs there is a page titled "Building Mobile Specific Views" but is under construction: https://docs.asp.net/en/latest/mvc/views/mobile.html.

Does anyone have some insight on building mobile views or successfully doing device detection?


回答1:


Serving specific views based on the browser's user-agent is an outdated concept as it do not sufficiently says much about the capabilities of the device. For example, iPhone and iPad come in different screen sizes and even mobile browsers allow to change the user-agent.

The new concept is called Responsive Design where one creates a single page that fits and show/hides certain element based on the available screen width. One popular responsive deisgn CSS Framework is Bootstrap, originally developed by Twitter and later open-sourced.

Here is an example of responsive design. When you go to the site and change the width of your browser, the design updates as well from 3 to 2 to 1 column design with browser or mobile like navigation (with the Hamburger menu).




回答2:


This feature actually was not implemented by microsoft. There is couple open discussions for this question:

  • https://github.com/aspnet/Mvc/issues/4877

  • https://github.com/aspnet/Razor/issues/751

As a generic answer from them - use responsive web design and css media queries (which from my point of view is not perfect answer for team that claims himself for building general web framework). There is a implementation for this feature exist as pull request - https://github.com/aspnet/Mvc/pull/4878.

Since this pull request seems to be forgotten, i extract this code into separate project which is available on https://github.com/laskoviymishka/MvcDeviceDetector.

You may use this implementation (which is easy to add to exist MVC project) or implement this itself. This is pretty easy - you need just implement and reqister own IViewLocationExpander for that.




回答3:


This can be handle in .Net Core using RazorViewEngineOptions

1) Create Service LocationExpanderService.cs

 public class LocationExpanderService : IViewLocationExpander
{

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context,
        IEnumerable<string> viewLocations)
    {
        //replace the Views to MyViews..  

        var viewLocationsFinal = new List<string>();
        if (!string.IsNullOrEmpty(context.Values["viewCustom"]))
        {
            foreach (var viewLocation in viewLocations)
            {
                viewLocationsFinal.Add(viewLocation.Replace(".cshtml", ".mobile.cshtml"));
            }
        }
        viewLocationsFinal.AddRange(viewLocations);
        return viewLocationsFinal;
    }

    public void PopulateValues(ViewLocationExpanderContext context)
    {

        var userAgent = context.ActionContext.HttpContext.Request.Headers["User-Agent"].ToString().ToLower();
        var viewCustom = userAgent.Contains("android") || userAgent.Contains("iphone") ? "mobile" : "";
        context.Values["viewCustom"] = viewCustom;
    }
}

2) Configure services in startup.cs

  services.Configure<RazorViewEngineOptions>(o =>
        {
            o.ViewLocationExpanders.Add(new LocationExpanderService());
        });

3) Create view with .mobile extension

Index.mobile.cshtml


来源:https://stackoverflow.com/questions/38331717/mobile-specific-views-device-detection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!