[英]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.Display
、 Html.Hidden
和Html.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.