【问题标题】:LabelFor() in a foreachforeach 中的 LabelFor()
【发布时间】:2011-09-16 13:30:03
【问题描述】:

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

<%@ 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>

我不确定如何使用Html.LabelFor()item 中显示Bar 属性

有人可以帮我解决这个问题吗?

谢谢,

【问题讨论】:

  • 您的代码是否出错?
  • @AndyC 我不知道如何在 Bar 获取循环变量 item。 f => f.[这里没有酒吧。只有Foos]`
  • @TheOtherGuy,我见过的大多数示例都将标签硬编码为表格标题,然后为每个之后完成。你在桌子上展示你的吗?您是否有理由需要在 foreach 中使用标签(它只会不断地为每一行重复您的标签)
  • @Manatherin 我有一个 Foo 对象的集合,我正在尝试为每个表行中的每个 Foo 显示 Bar 属性。

标签: c# asp.net-mvc


【解决方案1】:

改为这样做:

<% foreach (var item in Model.Foos) { %>      
<tr>          
    <td>              
        <%= Html.LabelFor(f => item.Bar) %>          
    </td>
<% } %>

而不是 f => f.Bar do f => 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>
}

【讨论】:

  • 太棒了。不知道如何以及为什么。对不匹配的必要性的解释将对新手有所帮助。
  • 相关问题:如何做到这一点并让TextBoxFor 为每个项目生成不同的 ID,以便我可以正确更新?
  • 我不确定为什么这不是公认的答案。
【解决方案2】:

你试过了吗

<% for (var i=0; i<Model.Foos.Count();i++) { %> 
    <tr> 
        <td> 
            <%= Html.LabelFor(f => f.Foos[i].Bar) %> 
        </td> 

LabelFor 扩展使用 lamda 表达式从您的模型对象转到选定的属性,请考虑 f 模型的替代变量。所以你需要一种方法来从你的模型到你选择的属性。您正在告诉 LabelFor,创建一个名为 f 的局部变量并将其分配给您的模型的值。然后使用 => 之后的位来确定目标属性。

如果您迫切需要使用 foreach,则必须有一种方法将 item 转换回原始模型的属性(例如,对于 Gledrius 所说的数组x=&gt;x.Foos[Model.Foos.IndexOf(foo)])

如果你只想要文本值,那就失败了

使用 '' 而不是整个标签,或者如果您有 ASP.NET 4 和 MVC2 或更好地使用 &lt;%: item %&gt; 来获得 HTML 编码优势

【讨论】:

  • 我会试试这个但不能使用foreach 吗?
  • LabelFor 将表达式作为参数,因此您无法将对象传递给它(因此您无法将 item 变量传递给它)。
  • 您要求提供一个 foreach 示例,我提供了一个有效的示例,但随后您接受了不使用 foreach 的答案。 o_O
  • 这种方法的一个缺点是你最终会得到多个 `
【解决方案3】:

您也可以只编写一个不直接绑定到页面模型的自定义扩展。

   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>
}

【讨论】:

    【解决方案4】:

    来自here,看来您需要在属性上指定DisplayName

    [DisplayName("My Bar")]
    public string Bar { get; set; }
    

    【讨论】:

    • 这不是他想要的。
    • 问题是,我不知道如何去指定属性栏。是f =&gt; f.Bar(不编译)还是item =&gt; item.Bar(也不编译)
    • @TheOtherGuy - Html.LabelFor(x =&gt; item.Bar)怎么样?
    【解决方案5】:

    您正在迭代您的 Foo,但根本没有使用 item 变量。

    【讨论】:

    • 我如何使用item ?当我做item =&gt; item.Bar时,我得到A parameter named item cannot be declared in this scope ...
    【解决方案6】:

    如果 Foos 是列表,它看起来像这样:

    Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多