Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# foreach中的LabelFor()_C#_Asp.net Mvc - Fatal编程技术网

C# foreach中的LabelFor()

C# foreach中的LabelFor(),c#,asp.net-mvc,C#,Asp.net Mvc,我有一个与之关联的强类型模型的视图 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %> 在我看来 <% foreach (var item in Model.Foos) { %> &l

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

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
                  Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %>
在我看来

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

f、 条)%>
我不知道如何使用
Html.LabelFor()

有人能帮我吗

谢谢,

从,看起来您需要在属性上指定:

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

如果要列出Foos,它将如下所示:

Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)])
@foreach (Foo foo in Model)
{
    <p>
       @(Html.LabelForItem<Foo, string>(foo, f => f.Name))
    </p>
}

您正在对Foo进行迭代,但根本不使用item变量

你试过了吗

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

扩展标记使用一个LAMDA表达式从模型对象到所选属性,考虑F为模型的替换变量。因此,您需要一种从模型到所选属性的方法。您要告诉LabelFor,创建一个名为f的局部变量,并用模型的值分配它。然后使用=>后面的位确定目标属性

如果您非常想使用foreach,则必须有一种方法将项转换回原始模型的属性(例如,对于Gledrius所说的数组
x=>x.Foos[model.Foos.IndexOf(foo)])

如果您只需要文本值,则失败

使用“”而不是整个labelfor,或者如果您有ASP.NET 4和MVC2或更好的版本,请使用
进行HTML编码,请执行以下操作:

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

项目(条形图)%>
而不是f=>f.Bar do f=>item.Bar,其中item是foreach循环中变量的名称

下面是更漂亮的razor语法:)

@foreach(Model.Foos中的变量项){
@LabelFor(f=>item.Bar)
@DisplayFor(f=>item.Bar)
}

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

   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());
   }
public static MvcHtmlString LabelForItem(此HtmlHelper html,T obj,表达式)
{
Func Func=expression.Compile();
V val=func(obj);
返回html.Label(val.ToString());
}
你会这样使用它:

Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)])
@foreach (Foo foo in Model)
{
    <p>
       @(Html.LabelForItem<Foo, string>(foo, f => f.Name))
    </p>
}
@foreach(模型中的Foo-Foo)
{

@(Html.LabelForItem(foo,f=>f.Name))

}
该代码有错误吗?@AndyC我不知道如何获取循环变量
项的Bar。f=>f.[这里没有横条,只有Foos]`@TheOtherGuy,我看到的大多数示例都将标签硬编码为表头,然后在每个表头之后执行for。你在桌子上展示你的吗?你为什么需要在foreach中使用标签(它只会不断地为每一行重复你的标签)@Manatherin我有一个Foo对象的集合,我正试图为每个表行中的每个Foo显示Bar属性。这不是他想要的。问题是,我不知道如何指定属性栏。它是
f=>f.Bar
(不编译)还是
item=>item.Bar
(也不编译)@TheOtherGuy-关于
Html.LabelFor(x=>item.Bar)
我如何使用
item
?当我执行
item=>item.Bar
时,我得到
一个名为item的参数不能在此范围内声明
我将尝试此方法,但无法使用
foreach
?LabelFor将表达式作为参数,因此您无法将其传递给对象(因此您无法将其传递给项目变量)。您要求使用foreach示例,我提供了一个有效的示例,但随后您接受了不使用foreach的答案。这种方法的缺点是,你最终会得到多个“太棒了”。但我不知道怎么做,为什么。解释不匹配的必要性将有助于NOOB。相关问题:我如何做到这一点,并让
TextBoxFor
为每个项目生成不同的ID,以便正确更新?
@foreach (Foo foo in Model)
{
    <p>
       @(Html.LabelForItem<Foo, string>(foo, f => f.Name))
    </p>
}