在foreach中的LabelFor()

时间:2011-09-16 13:30:04

标签: c# asp.net-mvc

我有一个与其关联的强类型模型的视图

<%@ 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()属性

有人可以帮我这个吗?

谢谢,

6 个答案:

答案 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变量。