为什么DisplayFor不会将值发布到Action Method?

时间:2013-08-24 20:04:32

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-2

当我们使用下面的方法将表格发布到Action Method时,我们可以在Parameter。中看到View Model值。

@Html.EditorFor(model => model.Foo)

当我们使用下面的方法将表单发布到Action Method时,我们无法在Parameter中看到View Model值。

@Html.DisplayFor(model => model.Foo)

所以,在后面的案例中,w可以隐藏字段。所以,我认为,当发布表单值时,我们不应该DisplayFor

问题:为什么DisplayFor不向操作方法发布值?我们可以讨论这个的内部机制吗?

3 个答案:

答案 0 :(得分:12)

因为DisplayFor不呈现属性的输入字段。这就是为什么它被称为DisplayFor,而不是EditorFor。它旨在用于向用户显示属性。

例如,假设您的模型中有一个名为Name的字符串属性,其值为“John”。在这种情况下,以下是在页面上为该属性呈现Html.EditorForHtml.DisplayFor的方式:

@Html.EditorFor(model => model.Name)

这将呈现为:

<input name="Name" id="Name" type="text" value="John" /> 

但是,

@Html.DisplayFor(model => model.Name)

将呈现为:

John

顺便说一下,Html.HiddenFor会在您的页面上呈现一个隐藏字段,该字段将发布到您的Controller。通过上面的例子,

@Html.HiddenFor(model => model.Name)

将呈现如下:

<input name="Name" id="Name" type="hidden" value="John" />

当您希望用户在页面中输入数据时使用EditorFor,当您希望向用户显示只读数据时使用DisplayFor,并在需要时使用HiddenFor您希望在提交表单时将数据发布到Controller,但数据不应由用户编辑和显示。一个例子是用户未编辑的ID字段,但您需要在表单中使用它。

看一下这篇文章:What is the @Html.DisplayFor syntax for?

答案 1 :(得分:7)

查看html渲染。没有属性name。或不是输入标签。表单标记仅发送具有属性input, select, textarea,...的标记元素name。例如:

<form...>
   <input id="lastname" name="lastname" />
</form>

不是这个:

<form...>
   <input id="lastname" />
</form>

enter image description here

答案 2 :(得分:0)

显然,解决此问题的唯一方法是使用“EditorFor”属性并将 readonly 属性设置为 true 或使用“hidden;”属性。具有显示属性的字段。

由于这些都不可能,您将需要复制每个预填充字段:一个供用户查看(预填充视图的唯一原因)和相同数据的隐藏元素,以便它可以获取传递回控制器。 当然,您可能需要在模型/视图模型中包含重复的字段,以便 DisplayFor 和 HiddenFor 可以分别引用它们自己的模型成员。我不确定 cshtml 文件中的两个显示元素是否可以引用相同的模型成员/字段。

如果有更好的方法,我很想听听。