题 MVC4 Razor - @ Html.DisplayFor不绑定到模型


我试图用MVC4 Razor找到我的脚,我坚持这个简单的问题。

当我使用@ Html.DisplayFor时,模型总是以NULL形式返回,但是当我使用@ Html.TextBoxFor这个模型完全填充时,我错过了什么?

提前致谢


27
2018-06-15 19:24


起源


我需要将字段显示为“标签”。这就是为什么;此视图的目的是使用户能够在将数据提交到数据库之前查看数据。我有什么想法可以做到这一点? - Jacques


答案:


这是许多人在asp.net mvc框架中遗漏的常见问题。不只是助手的差异如 HiddenForDisplayForTextBoxFor  - 但框架如何设置自动收集和验证这些输入。魔术都是用HTML5的data- *属性完成的。当您看到生成的输入标记时,您会注意到将会有一些额外的属性 data-valdata-val-required,也许还有一些类型的附加数据属性,例如数值 data-val-number

这些数据属性允许jQuery扩展 jquery.validate.unobtrusive.js 解析DOM,然后决定要验证哪些字段或生成错误消息。

发布数据的实​​际收集反映在 name 属性。这应该映射到c#或vb中的模型 [HttpPost] 方法。

使用 HiddenFor 当您想要提供用户不需要注意的发布数据时。

使用 DisplayFor 当您想要显示记录但不允许对其进行编辑时。

使用 TextBoxFor 当您想允许用户输入或允许用户编辑字段时。

编辑

"the purpose of this view is to enable the user to view the data before submitting it to the database. Any ideas how I can achieve this?"

你可以用两个人完成这个 HiddenFor 和 DisplayFor。使用 HiddenFor 让值准备好发布,和 DisplayFor 展示这些价值观。


54
2018-06-15 19:34



非常好。谢谢。 - mostafakvd


DisplayFor 不会做模型绑定。 TextBoxFor 会做,因为它创造了一个 input 表单中的元素和表单可以在发布时处理它。如果你想在HttpPost动作中获得一些数据并且你不想使用TextBoxFor,你可以将该pirticulare模型proeprty保存在表单内的隐藏变量中使用 HiddenFor 像这样的HTML帮助方法。

@using(Html.BeginForm())
{
  <p>The Type Name is</p> @Html.DisplayFor(x=>x.TypeName)
  @Html.HiddenFor(x=>x.TypeName)
  <input type="submit" value="Save" />
}

15
2018-06-15 19:27



嗨Shyju,我需要将字段显示为“标签”。这就是为什么;此视图的目的是使用户能够在将数据提交到数据库之前查看数据。我有什么想法可以做到这一点? - Jacques
!@jacques:所以使用Displayfor向用户显示数据并使用HiddenFor将这些数据保存在隐藏变量中,然后你就可以做一个表单了。 - Shyju


两者兼用 DisplayFor 和 HiddenForDisplayFor 只显示文本而不是输入字段,因此不会回发。 HiddenFor 实际创造 <input type="hidden" value="xxxx"/>


5
2017-08-02 04:23





DisplayFor 构建HTML标签,而不是输入。标签未发布到服务器,但输入是。


1
2018-06-15 19:27





你的意思是在表格发布期间?如果使用DisplayFor,则会创建一个不包含任何表单值的元素。通常,您可以将它们相互结合使用,为文本框创建标签,然后使用Html.TextBoxFor允许用户修改数据元素。

例:

@Html.DisplayFor(x=>x.Item)
@Html.TextBoxFor(x=>x.Item)

将渲染

Item <a text input field following>

或者在HTML中

<label for="Item">Item</label><input type="Text" id="Item" name="Item"/>

0
2018-06-15 19:28





我知道这是一个古老的问题,但你可以滚动自己的自定义组合显示控件,如下所示。这将呈现模型值,后跟该值的隐藏字段

@Html.DisplayExFor(model => Model.ItemCode)

只需使用框架已有的内容即可

public static MvcHtmlString DisplayExFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex)
{
    var sb = new StringBuilder();
    sb.Append(htmlHelper.DisplayFor(ex));
    sb.Append(htmlHelper.HiddenFor(ex));

    return MvcHtmlString.Create(sb.ToString());
}

0
2018-06-20 11:53