35

我试图用 MVC4 Razor 找到我的脚,但我遇到了这个简单的问题。

当我使用 @Html.DisplayFor 时,模型总是作为 NULL 发回,但是当我使用 @Html.TextBoxFor 时,这个模型已完全填充,我错过了什么?

提前致谢

4

6 回答 6

63

这是很多人在 asp.net mvc 框架中忽略的一个常见问题。不仅是 , , 等辅助函数的不同,还HiddenFor包括框架如何准确地设置自动收集和验证这些输入。神奇的是 HTML5 的 data-* 属性。当查看生成的输入标签时,您会注意到会有一些额外的属性以 , 的形式出现,并且可能还有一些类型的额外数据属性,例如数字将是。DisplayForTextBoxFordata-valdata-val-requireddata-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显示这些值。

于 2012-06-15T19:34:50.147 回答
16

DisplayFor不会进行模型绑定。TextBoxFor会这样做,因为它会input在表单中创建一个元素,并且表单可以在发布时处理它。如果您想在 HttpPost 操作中获取一些数据并且不想使用 TextBoxFor,则可以使用HiddenForHTML 帮助器方法将 pirticulare 模型属性保存在表单内的隐藏变量中。

@using(Html.BeginForm())
{
  <p>The Type Name is</p> @Html.DisplayFor(x=>x.TypeName)
  @Html.HiddenFor(x=>x.TypeName)
  <input type="submit" value="Save" />
}
于 2012-06-15T19:27:36.780 回答
6

同时使用DisplayForHiddenForDisplayFor只是显示文本而不是输入字段,因此不会回发。 HiddenFor实际上创造<input type="hidden" value="xxxx"/>

于 2012-08-02T04:23:52.930 回答
2

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

于 2012-06-15T19:27:37.203 回答
0

你的意思是在表单发布期间?如果您使用 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"/>
于 2012-06-15T19:28:28.323 回答
0

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

@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());
}
于 2018-06-20T11:53:27.653 回答