我正在阅读一些 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 文件夹。例如,主视图文件夹如下所示:
我不得不不同意@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/