【问题标题】:MVC treating lambda for HiddenFor differently from DisplayForMVC 处理 HiddenFor 的 lambda 与 DisplayFor 不同
【发布时间】:2013-05-16 00:20:14
【问题描述】:

我遇到了一个问题,我希望 Html.HiddenFor 从我的模型中解析 id,并发现 ModelStateCollection 是由查询参数、发布数据以及您的模型构成的(如在此处讨论的 https://stackoverflow.com/a/8749419/910348)。

但我不明白为什么 Html.DisplayFor 的解析方式与 HiddenFor 不同。这是我的代码:

// Model
public class FooModel
{
    public int id { get; set; }
}

// Controller
public ActionResult Foo(int id)
{
   var model = new FooModel { id = 111 };
   return View(model);
}

// Form
@model MVCProject.Models.FooModel

@using (Html.BeginForm())
{
<fieldset>
  <legend>FooModel</legend>

  @Html.HiddenFor(model => model.id)
  <p>ID: @Html.DisplayFor(model => model.id)</p>

  <p><input type="submit" value="Save" /></p>
</fieldset>
}    

请求的结果 HTML /Home/Foo/999:

<input data-val="true" data-val-number="The field id must be a number." 
   data-val-required="The id field is required." id="id" name="id" 
   type="hidden" value="999" />
<p>ID: 111</p>

这是 HiddenFor 和 DisplayFor 将它们的 lambda 表达式解析为不同值的预期行为吗?为什么?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    之所以有不同的行为是因为HiddenFor 是从ModelStateCollection 拉出的。这是一个输入,因此是框架首先关注的地方。

    DisplayFor 不会尝试呈现任何类型的输入、选择、文本区域等。它只是吐出值。因为它不是任何类型的输入,所以它不关心ModelStateCollection

    如果您考虑普通 Web 应用程序的流程,您会看到一个需要填充的表单。完成后,您提交表单,您将被带到一个全新的页面(具有全新状态),或者您返回到当前页面以进行更改或查看数据。在大多数情况下,显示用户刚刚在其请求中提交的数据是有意义的。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多