我正在为 ASP.NET MVC 4(RC)视图使用自定义显示模式,以允许自定义视图内容。
我对这个仅限移动应用程序的规则非常简单,并根据用户的内部配置文件/会话配置进行定义:
DisplayModeProvider.Instance.Modes.Insert(0,
new DefaultDisplayMode("Tablet")
{
ContextCondition = (context =>
{
if (SessionManager.Current == null)
return false; // assume phone initially
if (SessionManager.Current.Session.ScreenWidth > 600)
return true;
return false;
})
});
DisplayModeProvider.Instance.Modes.Insert(0,
new DefaultDisplayMode("Phone")
{
ContextCondition = (context =>
{
if (SessionManager.Current == null ||
SessionManager.Current.Session.ScreenWidth <= 600)
return true; // assume phone initially
return false;
})
});
我现在可以创建使用 xxxx.Phone.cshtml 和 xxxx.Tablet.cshtml 的视图。将呈现正确的视图。
但是,ViewContext.DisplayMode.DisplayModeId 总是返回空白。例如,在下面的页面中,我回显显示模式和硬编码的 id 来判断渲染了哪个视图:
<div>@Model.Distance - @ViewContext.DisplayMode.DisplayModeId - Tablet</div>
我看到硬编码的平板电脑(或手机)值,但显示模式 ID 始终为空。
是否应设置此值?我认为这在 MVC 4 测试版的先前版本中有效,但我不是 100% 确定。
有什么想法吗?
如果我没记错的话,当 ContextCondition 设置为 null 时,可能会发生这种情况。发生这种情况时,不会考虑所有其他 DisplayModeProvider。
您确定所有上下文条件都不返回空吗?也许是因为委托内部的例外?您是否尝试返回固定值(用于测试目的?
使用 ViewContext.DisplayMode.DisplayModeId
获取模式是不切实际的。仅当视图名为 ViewName.Table.cshtml 时,代码才有效。如果只有您的主节点是 _Master.Tablet.cshtml,则该属性将返回空结果。
因此,只有当您的视图是正确的模式时,您才会获得正确的结果,这使得获取模式毫无意义。