2

我想根据用户是否从移动设备访问网站来动态更改布局。我有几个关于这个主题的问题。

  1. 一旦确定布局,但在呈现视图之前,我想更改布局。也就是说,是否有一些我可以使用的钩子,我可以将任何可能存在的嵌套布局更改layout.cshtml为“递归”。layout.mobile.cshtml

    覆盖RazorViewEngineCreateView方法是否足够?它需要一个masterPath参数,所以也许我可以实现一个自定义RazorViewEngine并覆盖这个方法,对吧?

  2. 第二个问题是关于移动浏览器检测。我不太关心特定设备。我只想将桌面与移动设备区分开来。WURFL在这种情况下是否有必要?

    检查是不是Request.Browser.ScreenPixelsWidthScreenPixelsHeigth可笑?(因为大多数我要改变的是使用与否jQuery.mobile,它是数据属性。

4

2 回答 2

1

此功能内置于 ASP.NET MVC 4 中,因此您可以开箱即用。

Scott Hansleman在博客中介绍了如何在 ASP.NET MVC 3 中实现相同功能并为升级做好准备,因为他建议的 NuGet 与 ASP.NET MVC 4 规范兼容。

于 2012-05-08T17:35:33.420 回答
0

如果可以,请使用 Darin Dimitrov 指出的 ASP MVC 4。它开箱即用地支持这一点。

如果您卡在 MVC 3 上,以下是我们在产品中的做法:

1) 安装 WURFL

2) 实现一个调用 WURFL 并解析设备能力的 HttpCapabilitiesProvider;东西解决了结果。一定要添加一个名为 isMobileBrowser 的属性(wurfl 公开了这个)

3) 告诉 .NET 使用您的功能提供程序而不是默认的 HttpCapabilitiesBase.BrowserCapabilitiesProvider = new YourBrowserCapabilitiesProvider(_wurflManager);

4)创建一个CustomViewEngine(继承RazorViewEngine)。覆盖 FindPartialView 和 FindView。这些应该查看 controllerContext.RequestContext.HttpContext.Request.Browser.Capabilities["isMobileBrowser"] 并映射到适当的名称,例如 myView.cshtml.mobile。您需要同时解析 viewName 和 masterName。

4.1) 还在CustomViewEngine的FindPartialView & FindView中,搜索搜索~/Views/{0}/{1}和~/Views/Shared/{0}/{1},其中{0}是控制器(controllerContext.RouteData.GetRequiredString( "controller")) 和 {1} 是您的映射视图名称

4.2) Return return new ViewEngineResult(CreateView(controllerContext, viewPath, masterPath), this);

于 2012-05-09T01:12:50.890 回答