4

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

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

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

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

所以,在后面的情况下,我们可以使用隐藏字段。所以,我认为,DisplayFor当涉及到表单值时,我们不应该这样做。

问题:为什么DisplayFor不向 Action Method 发布值?我们可以讨论一下内部机制吗?

4

3 回答 3

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将在您的页面上呈现一个隐藏字段,该字段将发布到您的控制器。有了上面的例子,

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

将呈现如下:

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

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

看看这篇文章:@Html.DisplayFor 语法是什么?

于 2013-08-24T21:38:27.693 回答
7

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

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

不是这个:

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

在此处输入图像描述

于 2013-08-24T20:39:27.217 回答
0

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

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

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

于 2021-07-21T15:39:04.740 回答