MVC3 Helper DisplayFor Model

时间:2011-12-07 22:03:00

标签: asp.net-mvc-3

我有一个显示项目列表的视图。我不想在网格中显示项目,而是每页显示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助手,但方法不可用,我不知道要传递给什么他们如果是的话。

我不确定这是否可能,但我想我会问。

修改 我正在尝试使用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(@ model.Items中的var项目){     @ Html.DisplayViewerFor(项目) }

1 个答案:

答案 0 :(得分:4)

您可以使用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>

我假设您的图片网址使用{controller} / {action} / {id}的默认路由,因此我使用了Url.Action并指定了您的ID。

你也可以使用DisplayTemplate for“TestItemDisplayList”并将该代码移入你的页面,但我不清楚你是否想在其中添加逻辑以限制页数。