如何获取当前的displaymode在mvc4中是移动的

时间:2012-05-22 13:17:13

标签: c# asp.net-mvc-4

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

我的问题是:我有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 个答案:

答案 0 :(得分:7)

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

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

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

这是一个nice trick I found on the ASP.NEt forums,它可以让您使用框架稍后使用的相同逻辑来确定显示模式:

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.");
}

答案 1 :(得分:1)

检查以下值:HttpContext.GetOverriddenBrowser()。IsMobileDevice

答案 2 :(得分:0)

我相信MS希望您使用this

controller.ControllerContext.DisplayMode

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

  1. 单元测试。无法手动设置DisplayMode属性(抛出NullReferenceException)并且无法模拟,因为它不是虚拟的。
  2. 它不适用于MvcDonutCaching。在请求页面的缓存部分时,DisplayMode只返回NULL。

答案 3 :(得分:0)

你有最好的选择是检查请求标题用户代理字段,你可以在那里监听Android iPhone等。虽然这不会给你屏幕尺寸,如果你不是在听诺基亚手机或类似的东西,它不会工作,这是一个解决方案,允许您像大多数公司一样限制您的支持。