对象模板 - 使用ViewBag的Html.Display

时间:2011-02-16 17:04:17

标签: asp.net-mvc templates asp.net-mvc-3

我有对象(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()

2 个答案:

答案 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属性..