Шаблон объекта - Html.Display с использованием ViewBag - PullRequest
1 голос
/ 16 февраля 2011

У меня есть следующий шаблон отображения для объекта ( 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 ]

1 голос
/ 18 февраля 2011

Найденное решение: http://haacked.com/archive/2010/05/05/asp-net-mvc-tabular-display-template.aspx - @Html.DisplayFor(m => prop.Model) работает как положено.Кто знал, что в метаданных есть Model свойство ...

1 голос
/ 17 февраля 2011

Что касается ViewBag.Title , вы можете переместить присвоение ему в конце страницы:

@model Article

@Html.DisplayForModel()

@{
    ViewBag.Title = "Detail";
}

Что касается других ViewBag элементов, вы можете использовать необычные имена элементов (с несколькими ведущими подчеркиваниями и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...