当我们使用下面的方法将表格发布到Action Method时,我们可以在Parameter。中看到View Model值。
@Html.EditorFor(model => model.Foo)
当我们使用下面的方法将表单发布到Action Method时,我们无法在Parameter中看到View Model值。
@Html.DisplayFor(model => model.Foo)
所以,在后面的案例中,w可以隐藏字段。所以,我认为,当发布表单值时,我们不应该DisplayFor
。
问题:为什么DisplayFor
不向操作方法发布值?我们可以讨论这个的内部机制吗?
答案 0 :(得分:12)
因为DisplayFor不呈现属性的输入字段。这就是为什么它被称为DisplayFor,而不是EditorFor。它旨在用于向用户显示属性。
例如,假设您的模型中有一个名为Name的字符串属性,其值为“John”。在这种情况下,以下是在页面上为该属性呈现Html.EditorFor
和Html.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字段,但您需要在表单中使用它。
答案 1 :(得分:7)
查看html渲染。没有属性name
。或不是输入标签。表单标记仅发送具有属性input, select, textarea,...
的标记元素name
。例如:
<form...>
<input id="lastname" name="lastname" />
</form>
不是这个:
<form...>
<input id="lastname" />
</form>
答案 2 :(得分:0)
显然,解决此问题的唯一方法是使用“EditorFor”属性并将 readonly 属性设置为 true 或使用“hidden;”属性。具有显示属性的字段。
由于这些都不可能,您将需要复制每个预填充字段:一个供用户查看(预填充视图的唯一原因)和相同数据的隐藏元素,以便它可以获取传递回控制器。 当然,您可能需要在模型/视图模型中包含重复的字段,以便 DisplayFor 和 HiddenFor 可以分别引用它们自己的模型成员。我不确定 cshtml 文件中的两个显示元素是否可以引用相同的模型成员/字段。
如果有更好的方法,我很想听听。