MVC3 Helper Display для модели - PullRequest
       2

MVC3 Helper Display для модели

1 голос
/ 08 декабря 2011

У меня есть вид, который отображает список элементов. Вместо отображения элементов в сетке я хотел бы отображать 4 элемента на странице, каждый с изображением и несколькими свойствами, отображаемый в уникальном макете.

Итак, я бы хотел, чтобы foreach перебирал элементы, и каждый элемент отображался в div. Я мог бы поместить весь код в цикл, но я хотел бы иметь собственное расширение html-помощника для этого.

Я придумал это,

public static MvcHtmlString DisplayViewerFor(this HtmlHelper helper, TestModel model, bool rightAligned = true) {
        if (model == null) {
            model = new TestModel();
        }

        var outterDiv = new TagBuilder("div");
        outterDiv.AddCssClass(rightAligned ? "item-display-right" : "item-display");

        var image = new TagBuilder("image");
        image.Attributes.Add("src", "Item/GetImage/" + model.ItemName);
        image.Attributes.Add("height", "150");

        var editorLabel = new TagBuilder("div");
        editorLabel.AddCssClass("editor-label");


        //LOOKING TO ADD CODE LIKE THIS HERE

        var labelContent= html.LabelFor({my model property here})
        editorLabel.InnerHtml += labelContent;

        //END OF ADD


        return new MvcHtmlString(outterDiv.ToString(TagRenderMode.EndTag));
    }

В моем методе выше мне нужно отобразить еще несколько значений, и я хотел бы использовать помощники Html.LabelFor и Html.DisplayFor, но методы недоступны, и я не уверен, что передать их, если они были.

Я не уверен, возможно ли это или нет, но я решил спросить.

EDIT Я пытаюсь использовать html.LabelFor. Посмотрите мой код, где я обновил его выше, добавив к нему эти две строки.

var labelContent= html.LabelFor({my model property here})
editorLabel.InnerHtml += labelContent;

Вы можете увидеть код выше.

РЕДАКТИРОВАТЬ 2

Вот запланированное использование этого помощника с заглушкой.

@ model TestItemDisplayList

@ { ViewBag.Title = "Items"; Layout = "~ / Views / Shared / _Layout.cshtml"; }

@ foreach (элемент var в @ model.Items) { @ Html.DisplayViewerFor (пункт) }

1 Ответ

4 голосов
/ 08 декабря 2011

Вы можете использовать метод Html.DisplayFor для рендеринга DisplayTemplate. Одна из перегрузок метода заключается в указании шаблона для использования. Вы можете изменить код своей страницы следующим образом:

Страница:

 @model TestItemDisplayList
 @{ ViewBag.Title = "Items"; Layout = "~/Views/Shared/_Layout.cshtml"; }
 @Html.DisplayFor(model => Model,"TestItemDisplayList")

Шаблон отображения для TestItemDisplayList

 @model TestItemDisplayList
 @* You could limit this loop to the first 4 items  *@
 @foreach(var item in model.Items){ @Html.DisplayFor(item => item) }

Шаблон отображения для TestModel

 @model TestModel
 <div class="item-display">
      <img src="@Url.Action("GetImage", "Image", new  { id = Model.ItemName})" height="150"/>
      <div class="editor-label">@Html.LabelFor(model => model.PropertyHere)</div>
 </div>

Я предполагаю, что ваш URL для изображения использовал маршрут по умолчанию {controller} / {action} / {id}, поэтому я использовал Url.Action и указал ваш ID.

Вы могли бы также избежать использования DisplayTemplate для «TestItemDisplayList» и перемещения этого кода на свою страницу, но я не был уверен, хотите ли вы добавить в него логику для ограничения количества страниц.

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