我正在开发移动网络应用程序。我需要让当前的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
?
如何解决这个问题?
答案 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
它有效但我发现它有两个主要问题(截至本文发布之日):
答案 3 :(得分:0)
你有最好的选择是检查请求标题用户代理字段,你可以在那里监听Android iPhone等。虽然这不会给你屏幕尺寸,如果你不是在听诺基亚手机或类似的东西,它不会工作,这是一个解决方案,允许您像大多数公司一样限制您的支持。