ASP.NET MVC 5 - LabelFor 显示属性名称而不是值,但 TextBoxFor 使用相同的属性可以正常工作

Posted

技术标签:

【中文标题】ASP.NET MVC 5 - LabelFor 显示属性名称而不是值,但 TextBoxFor 使用相同的属性可以正常工作【英文标题】:ASP.NET MVC 5 - LabelFor displays property name instead of value, but TextBoxFor works fine with the same property 【发布时间】:2021-05-22 09:25:27 【问题描述】:

我正在处理分配了 IList<MyModel> 模型的视图,并且我一直坚持使用 LabelFor 显示值(显示的是属性名称而不是其值),但是,即使在 TextBoxFor它与相同的属性一起使用。

部分视图代码:

@model IList<MyModel>

  @for (var i = 0; i < Model.Count; i++)
    
        <tr>
            <td>@html.LabelFor(m => m[i].Code)</td>
            <td>@Html.TextBoxFor(m => m[i].Price)</td>
        </tr>
   

模型类:

public class MyModel
  
    public string Code  get; set; 

    public double Price  get; set; 
  

@Html.TextBoxFor(m =&gt; m[i].Code) 也可以正常工作,因此问题显然与属性本身无关。

我可以只使用Label(),但我需要从表单中发布值,所以我还必须为Code 添加一个隐藏字段,我觉得这不是最优雅的解决方案。

为什么TextBoxFor 有效,而LabelFor 无效?

【问题讨论】:

【参考方案1】:

LabelFor 显示字段的名称(用于为控件创建标签)。

如果要显示字段的,请使用DisplayFor

<tr>
    <td>@Html.DisplayFor(m => m[i].Code)</td>
    <td>@Html.TextBoxFor(m => m[i].Price)</td>
</tr>

注意: DisplayFor 仅显示提交表单时不包含的文本值(如标签)。如果您需要与表单/模型一起返回的值,那么您需要添加一个隐藏字段。你可以使用@Html.HiddenFor(m =&gt; m[i].Code),它会创建一个隐藏的输入,像&lt;input type="hidden" name="myModels[0].Code" value="abc" /&gt;一样渲染。

【讨论】:

模型绑定在使用DisplayFor 时不起作用,但您的回答帮助我找到了这个:***.com/a/11057087/8297552。似乎隐藏字段是必要的:“您可以使用 HiddenFor 和 DisplayFor 来完成此操作。使用 HiddenFor 准备发布值,并使用 DisplayFor 显示这些值” @ŁukaszSypniewski 是的,您需要添加 @Html.HiddenFor(m =&gt; m[i].Code) 以将值传递回控制器,因为 DisplayFor 不会自动执行此操作。很高兴我能帮忙:)【参考方案2】:

LabelFor 的第一个参数定义了标识要显示的属性的表达式,第二个参数显示 texl 标签。

LabelExtensions.LabelFor Method

@for (var i = 0; i < Model.Count; i++)

    <tr>
        <td>@Html.LabelFor(m => m[i].Code, Model[i].Code)</td>
        <td>@Html.TextBoxFor(m => m[i].Price)</td>
    </tr>

【讨论】:

事实证明LabelFor 值不是从我不知道的表单中发布的,所以无论如何我都必须保留隐藏字段。 也有几种方法可以做到这一点,当然你也可以编写自己的自定义Helper

以上是关于ASP.NET MVC 5 - LabelFor 显示属性名称而不是值,但 TextBoxFor 使用相同的属性可以正常工作的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc crud 操作 datepicker

增加文本框大小引导程序(ASP.NET MVC)

用于 jQuery Mobile 控件的 Asp.Net MVC Razor 标记

从 ASP.NET MVC Lambda 表达式中获取价值

ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?

[ASP.NET Core 3.1 MVC Razor页面仅在模型成员有效时显示图标