我有对象(source)的以下显示模板:
@model object
@if (Model == null) {
@ViewData.ModelMetadata.NullDisplayText
} else if (ViewData.TemplateInfo.TemplateDepth > 1) {
@ViewData.ModelMetadata.SimpleDisplayText
} else {
foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) {
if (prop.HideSurroundingHtml) {
@Html.Display(prop.PropertyName)
} else {
<div>
<strong>@prop.GetDisplayName():</strong> @Html.Display(prop.PropertyName)
</div>
}
}
}
哪个很好用,直到ViewBag
中有相同的键。例如,在课程
public class Article {
public string Title { get; set; }
public string Text { get; set; }
}
应显示(并将显示空的ViewBag)
Title: Awesome title
Text: Awesome text
但是当ViewBag.Title
设置为"Detail"
Title: Detail
Text: Awesome text
由@Html.Display(prop.PropertyName)
引起的似乎更喜欢ViewBag
值与模型值。有什么建议?我不能使用Html.DisplayFor
因为我只有属性名存储在字符串变量中,而不是作为给定模型的表达式。
我想我可以清除viewbag并在以后恢复它,但这对我来说不是一个好的解决方案。
编辑:视图如下所示:
@model Article
@{
ViewBag.Title = "Detail";
}
@Html.DisplayForModel()
答案 0 :(得分:1)
至于 ViewBag.Title 本身,你可以在页面末尾移动赋值给它:
@model Article
@Html.DisplayForModel()
@{
ViewBag.Title = "Detail";
}
对于其他 ViewBag 项目,您可以使用不常见的项目名称(具有多个前导下划线等)。
答案 1 :(得分:1)
找到解决方案:http://haacked.com/archive/2010/05/05/asp-net-mvc-tabular-display-template.aspx - @Html.DisplayFor(m => prop.Model)
按预期工作。谁知道元数据中有Model
属性..