我有一个与其关联的强类型模型的视图
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %>
SomeViewModel看起来像这样
class SomeViewModel
{
public IEnumerable<Foo> Foos {get; set;}
}
并说Foo是
class Foo
{
public string Bar {get; set;}
}
并在视图中
<% foreach (var item in Model.Foos) { %>
<tr>
<td>
<%= Html.LabelFor(f => f.Bar) %>
</td>
我不确定如何使用Bar
item
中显示Html.LabelFor()
属性
有人可以帮我这个吗?
谢谢,
答案 0 :(得分:39)
请改为:
<% foreach (var item in Model.Foos) { %>
<tr>
<td>
<%= Html.LabelFor(f => item.Bar) %>
</td>
<% } %>
而不是f =&gt; f.Bar做f =&gt; item.Bar,其中item是foreach循环中变量的名称。
这是更漂亮的剃刀语法:)
@foreach( var item in Model.Foos ) {
<tr>
<td>
@Html.LabelFor(f => item.Bar)
</td>
<td>
@Html.DisplayFor(f => item.Bar)
</td>
</tr>
}
答案 1 :(得分:2)
你试过吗
<% for (var i=0; i<Model.Foos.Count();i++) { %>
<tr>
<td>
<%= Html.LabelFor(f => f.Foos[i].Bar) %>
</td>
LabelFor扩展使用lamda表达式从Model对象转到selected属性,考虑f为您的模型的替换变量。因此,您需要一种方法从您的模型到您选择的房产。您正在告诉LabelFor,创建一个名为f的局部变量,并为其指定模型的值。然后在=&gt;之后使用该位确定目标财产。
如果你迫切希望使用foreach,你必须有一种方法将项目翻译回原始模型的属性,(例如Gledrius所说的数组x=>x.Foos[Model.Foos.IndexOf(foo)])
失败
使用'&lt;%= item%&gt;'而不是整个标签,或者如果你有ASP.NET 4和MVC2或更好地使用<%: item %>
来获得HTML编码的好处
答案 2 :(得分:2)
您也可以编写一个不直接与页面模型绑定的自定义扩展程序。
public static MvcHtmlString LabelForItem<T, V>(this HtmlHelper html, T obj, Expression<Func<T, V>> expression)
{
Func<T,V> func = expression.Compile();
V val = func(obj);
return html.Label(val.ToString());
}
你会使用它,就像这样:
@foreach (Foo foo in Model)
{
<p>
@(Html.LabelForItem<Foo, string>(foo, f => f.Name))
</p>
}
答案 3 :(得分:0)
从here开始,您需要在属性上指定DisplayName
:
[DisplayName("My Bar")]
public string Bar { get; set; }
答案 4 :(得分:0)
如果Foos是列表,它将如下所示:
Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)])
答案 5 :(得分:0)
你正在迭代你的Foo,但根本没有使用item变量。