3

我有一个迭代集合并调用集合DisplayFor()中每个元素的视图。

我需要手动迭代(而不是将集合传递给 DisplayFor),以便告诉模板是否应该绘制列表中的中断。列表中的项目将只有 2 种类型,由它们排序,所以我只需要显示这个中断一次。

找到并正确调用了我的模板。
我可以看到它正确生成的 HTML,即:DisplayFor().ToHtmlString()
我可以将此 HTML 设置为范围变量,即:var html = DisplayFor().ToHtmlString()..
但即使Html.Raw(html)没有在浏览器中呈现它 - HTML 已经消失了。

这是怎么回事?

var renderBreakInList = Model.Items.Any(x => x.IsSomeType);
foreach(var item in Model.Items)
{
    var renderBreak = renderBreakInList && item.IsOtherType;
    Html.DisplayFor(x => item, new { renderBreak = renderBreak });

    if (renderBreak)
    {
        renderBreakInList = false;
    }
}
4

2 回答 2

4

Html.DisplayFor方法本身不会向响应呈现任何内容,只是将生成的 HTML 作为MvcHtmlString.

为了实际将呈现的 HTML 写入响应,您需要使用@符号将此告知 Razor:

@Html.DisplayFor(x => item, new { renderBreak = renderBreak })

所以你的整个代码应该是这样的:

@{
    var renderBreakInList = Model.Items.Any(x => x.IsSomeType);
    foreach(var item in Model.Items)
    {
        var renderBreak = renderBreakInList && item.IsOtherType;
        @Html.DisplayFor(x => item, new { renderBreak = renderBreak })

        if (renderBreak)
        {
            renderBreakInList = false;
        }
    }
}

或者您可以使用该方法(使用标志WebPageBase.Write时在后台调用):@

Write(Html.DisplayFor(x => item, new { renderBreak = renderBreak }));
于 2013-07-01T20:29:59.590 回答
0

在尝试了很多不同的事情并重新设计了我告诉模板绘制中断的方式后,终于弄清楚了这一点。

与其发送我希望使模板更健壮(如果订单更改)的布尔值,不如传递应该绘制中断的项目的 ID。

@{ 
    var breakItem = Model.Items.FirstOrDefault(x => renderBreakInList && x.IsSomeType);
    var breakID = breakItem == null ? (long?)null : (long)breakItem.ID;
}

@Html.DisplayFor(x => x.Items, new { breakID = breakID })    

也像 nemesv 指出的那样,Html.DisplayFor()需要在前面加上@. 我摆脱了在代码块中执行此操作的习惯,因为我总是会得到“一旦在代码块中你不需要 @` 错误..

于 2013-07-01T20:35:59.080 回答