10

我正在开发移动网络应用程序。我需要让当前的显示模式在控制器中是移动的。

我的问题是:我有 2 个局部视图

/Views/Shared/ListItem.cshtml
/Views/Shared/ListItem.mobile.cshtml

当使用PartialView("ListItem")时,这是正确的。但我需要将部分视图放在子文件夹中

/Views/Shared/Modules/Post/ListItem.cshtml
/Views/Shared/Modules/Post/ListItem.mobile.cshtml

当我使用PartialView("~/Views/Shared/Modules/Post/ListItem.cshtml")时,它适用于桌面。当 displaymode 为 mobile 时,ListItem.mobile.cshtml不显示。

我的选择是

if( CurrentDisplayMode==Mobile){
  PartialView("~/Views/Shared/Modules/Post/ListItem.mobile.cshtml");
else
  PartialView("~/Views/Shared/Modules/Post/ListItem.cshtml");

如何获得CurrentDisplayMode?如何解决这个问题呢?

4

4 回答 4

7

我还需要访问当前的显示模式,以便调整传递给视图的视图模型(移动视图中的信息较少,因此可以从较小的视图模型中显示)。

ControllerContext.DisplayMode不能使用,因为它将在操作执行后设置。

所以你必须根据上下文(用户代理、cookie、屏幕大小等)确定显示模式

这是我在 ASP.NET 论坛上找到的一个不错的技巧,它可以让您使用稍后将由框架使用的相同逻辑来确定显示模式:

public string GetDisplayModeId()
{
    foreach (var mode in DisplayModeProvider.Instance.Modes)
        if (mode.CanHandleContext(HttpContext))
            return mode.DisplayModeId;

    throw new Exception("No display mode could be found for the current context.");
}
于 2013-03-05T04:44:45.373 回答
1

检查值:HttpContext.GetOverriddenBrowser().IsMobileDevice

于 2012-05-22T14:11:13.143 回答
0

您拥有的最佳选择是检查请求标头用户代理字段,您可以在其中收听 android iPhone 等。虽然这不会给您提供屏幕尺寸,并且如果您不听诺基亚手机或类似的东西,这将不起作用,这是一个解决方案,并允许您像大多数公司一样限制您支持的内容。

于 2012-11-24T23:58:40.723 回答
0

我相信 MS 希望你使用这个

controller.ControllerContext.DisplayMode

它有效,但我发现了两个主要问题(截至本文发布之日):

  1. 单元测试。DisplayMode 属性不能手动设置(抛出 NullReferenceException)并且不能被模拟,因为它不是虚拟的。
  2. 它不适用于MvcDonutCaching。DisplayMode 在请求页面的缓存部分时仅返回 NULL。
于 2012-10-23T22:28:30.410 回答