繁体   English   中英

如何在迭代器中使用 Html.DisplayFor?

[英]How can I use Html.DisplayFor inside of an iterator?

喜欢MVC 2。整个东西非常适合网络。

但是,我无法从Html.DisplayFor()函数中调出一项功能:

<@ Page Inherits="ViewPage<IEnumerable<Foo>>">

<% foreach(var item in Model) { %>

    <%: Html.DisplayFor(item.BarBaz) %>

<% } %>

我需要能够为这个值使用 DisplayTemplate。 有没有办法做到这一点?

其实,我想通了。 我多么愚蠢。

这有效:

<@ Page Inherits="ViewPage<IEnumerable<Foo>>">

<% foreach(var item in Model) { %>

    <%: Html.DisplayFor(m => item.BarBaz) %>

<% } %>

但是,这对于 Html.HiddenFor 和 Html.ValueFor 将无法正常工作。 特别是, Html.HiddenFor(m => item.NullableDecimal)将呈现为<input name="NullableDecimal" value="0" />Html.ValueFor(m => item.NullableDecimal, "0.00##)将呈现作为0.00## 。但是,如果您将[DisplayFormat(DataFormatString = "{0:0.00########}"应用于您的视图模型,那么它会突然起作用。因此,您可能最好使用Html.DisplayHtml.HiddenHtml.Value扩展,因为当有人进行非本地更改时,您不太可能遇到事情失败的情况。

您可以通过远离 foreach 并使用常规 for 循环来完成它:

 <% for (int i = 0; i < Model.Count(); i++) { %>

    <%: Html.DisplayFor(p=> p.ElementAt(i).BarBaz) %>

 <%} %>

另一种选择是创建一个 PartialView,它接受一个 Foo 对象并只显示您想要的信息。

<% foreach (var item in Model)
   {
       Html.RenderPartial("FooBarBazLine", item);
   } %>

这是一个老问题,但我想有人可以从我的解决方案中受益:

Aspx 视图

<%@ Page Inherits="ViewPage<IEnumerable<Foo>>" %>

<% foreach (var item in Model) { %>

    <%: Html.DisplayFor(m => item) %>

<% } %>

剃刀视图

@model IEnumerable<Foo>

@foreach (var item in Model)
{
    Html.DisplayFor(m => item)
}

由于DisplayFor接受一个隐式类型的 lambda,我们可以直接指示要在循环中显示的实例。

最后,我同意Anders E. Andersen对模板使用的回答

Html.DisplayFor 可以自动迭代集合,为集合中的每个元素显示一个局部视图。

您需要做的第一件事是创建一个实际的模型类,该集合是该类的一个属性。

public class Bar
{
    public IEnumerable<Foo> foo { get; set; }
}

从您的控制器而不是原始集合返回此类。

其次,您需要一个 Foo 类的显示模板。 显示模板是部分视图,需要放置在文件夹Views/Shared/DisplayTemplates

编辑:如果您想将模板限制为特定控制器,您也可以将它们放在 Views 的控制器子文件夹中。 有关更多信息,请参阅此问题

下面是一个 razor 语法的例子:

@model YourNameSpace.Foo
<p>@Model.BarBaz</p>

在上面给出的DisplayTemplates文件夹中将其另存为Foo.cshtml

这个模板非常简单,因为它基于您只显示字符串的示例,但是如果集合元素所在的类具有自己的属性,您可以创建一个更复杂的模板。

现在在原始视图中,您可以完全摆脱循环,只需编写

@Html.DisplayFor(m => m.foo)

注意foo是新模型类中的属性名称,该类包含您之前循环过的旧集合。

DisplayFor 将自动知道foo属性是Foo类型(的集合),并在DisplayTemplates文件夹中选取Foo.cshtml模板,并为foo每个元素显示一次。

在剃刀我使用

@Html.DisplayFor(model => item.CreatedDate)

请注意,表单 POST 上的 DisplayFor 实际上并没有创建可以在控制器中引用的字段。 如果您需要引用提交的 POST 方法中的字段,则需要使用额外的 HiddenFor。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM