asp.net-mvc - 如何根据设备类型更改 ASP.NET MVC View ?

标签 asp.net-mvc views mobile-devices

我正在阅读一些 ASP.NET MVC,并且我有一个正在工作的 Web 应用程序,我将从 WebForms 迁移到 MVC。我希望在此过程中获得的功能请求之一是,如果用户来自移动设备,则返回一个简化的 View 。

我不太清楚实现这种逻辑的最佳位置在哪里。我确信有比在返回 View 的每个操作中为 Browser.IsMobileDevice 添加 if/else 更好的方法。我必须做什么样的选择?

最佳答案

更新 : 这个解决方案有一个微妙的错误。 MVC 框架将调用 FindView/FindPartialView两次:一次与 useCache=true ,如果不返回结果,则使用 useCache=false .由于所有类型的 View 只有一个缓存,如果桌面浏览器最先出现,移动用户最终可能会看到桌面 View 。

对于那些有兴趣使用自定义 View 引擎来解决这个问题的人,Scott Hanselman 在这里更新了他的解决方案:

http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

(为答案劫持道歉,我只是不希望其他人不得不经历这个!)

由 roufamatic (2010-11-17) 编辑

您要做的第一件事是介绍Mobile Device Browser File到你的项目。使用此文件,您可以定位您想要支持的任何设备,而无需了解这些设备在其 header 中发送的具体内容。该文件已经为您完成了工作。然后,您使用 Request.Browser 属性来定制您想要返回的 View 。

接下来,想出一个关于如何在 Views 文件夹下组织 View 的策略。我更喜欢将桌面版本保留在根目录,然后有一个 Mobile 文件夹。例如,主视图文件夹如下所示:


  • 移动的
  • 苹果手机
  • 索引.aspx
  • 黑莓
  • 索引.aspx
  • 索引.aspx

  • 我不得不不同意@Mehrdad 关于使用自定义 View 引擎的意见。 View 引擎有不止一个用途,其中之一就是为 Controller 寻找 View 。您可以通过覆盖 FindView 方法来做到这一点。在这种方法中,您可以检查在哪里可以找到 View 。在您知道哪个设备正在使用您的站点后,您可以使用您提出的用于组织 View 的策略来返回该设备的 View 。
    public class CustomViewEngine : WebFormViewEngine
    {
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            // Logic for finding views in your project using your strategy for organizing your views under the Views folder.
            ViewEngineResult result = null;
            var request = controllerContext.HttpContext.Request;
    
            // iPhone Detection
            if (request.UserAgent.IndexOf("iPhone",
       StringComparison.OrdinalIgnoreCase) > 0)
            {
                result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
            }
    
            // Blackberry Detection
            if (request.UserAgent.IndexOf("BlackBerry",
       StringComparison.OrdinalIgnoreCase) > 0)
            {
                result = base.FindView(controllerContext, "Mobile/BlackBerry/" + viewName, masterName, useCache);
            }
    
            // Default Mobile
            if (request.Browser.IsMobileDevice)
            {
                result = base.FindView(controllerContext, "Mobile/" + viewName, masterName, useCache);
            }
    
            // Desktop
            if (result == null || result.View == null)
            {
                result = base.FindView(controllerContext, viewName, masterName, useCache);
            }
    
            return result;
        }
    }
    

    上面的代码允许您根据策略设置 View 。如果没有找到设备的 View 或没有默认的移动 View ,则回退是桌面 View 。

    如果您决定将逻辑放在 Controller 中而不是创建 View 引擎。最好的方法是创建一个自定义 ActionFilterAttribute你可以用它来装饰你的 Controller 。然后覆盖 OnActionExecuted方法来确定哪个设备正在查看您的网站。您可以查看 blog post怎么做。这篇文章还有一些很好的链接,指向一些关于这个主题的 Mix 视频。

    关于asp.net-mvc - 如何根据设备类型更改 ASP.NET MVC View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387354/

    相关文章:

    reactjs - 无法在 Visual Studio C# ASP 内的 React 应用程序上使用 Material-UI。 NET核心网络应用程序

    asp.net-mvc - MVVM 模式的核心是什么?

    django - 如何从 View 中将值传递给 Django Form 的 init 方法?

    asp.net-mvc-3 - ASP.NET MVC3 Controller View 的物理位置

    jquery - Ajax 授权失败

    c# - 如何在 ASP.NET WebAPI 项目中使用 MVC 路由

    ios - 像 iPhone IMDB 应用程序这样管理滑动 View 的好方法是什么?

    google-chrome - 有没有办法让 Chrome 开发工具模拟移动设备的宽于屏幕宽度的网站的默认缩小 View ?

    css - 使用适用于移动设备的 CSS 调整 div 大小

    java - 如何使用 Java 通过 USB 端口与设备通信?