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 => 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 => m[i].Code)
,它会创建一个隐藏的输入,像<input type="hidden" name="myModels[0].Code" value="abc" />
一样渲染。
【讨论】:
模型绑定在使用DisplayFor
时不起作用,但您的回答帮助我找到了这个:***.com/a/11057087/8297552。似乎隐藏字段是必要的:“您可以使用 HiddenFor 和 DisplayFor 来完成此操作。使用 HiddenFor 准备发布值,并使用 DisplayFor 显示这些值”
@ŁukaszSypniewski 是的,您需要添加 @Html.HiddenFor(m => 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
用于 jQuery Mobile 控件的 Asp.Net MVC Razor 标记