【问题标题】:Why DisplayFor does not post values to Action Method?为什么 DisplayFor 不向 Action Method 发布值?
【发布时间】:2013-08-27 16:10:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      不是这个:

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

      【讨论】:

        【解决方案3】:

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

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

        会这样渲染:

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

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

        看看这个帖子:What is the @Html.DisplayFor syntax for?

        【讨论】:

          猜你喜欢
          • 2012-01-13
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          • 1970-01-01
          • 2022-08-07
          • 1970-01-01
          相关资源
          最近更新 更多