2

我遇到了一个问题,我期望 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>
}    

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

<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 表达式解析为不同值的预期行为吗?为什么?

4

1 回答 1

2

之所以有不同的行为是因为HiddenForModelStateCollection. 这是一个输入,因此这是框架首先关注的地方。

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

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

于 2013-05-16T00:29:43.140 回答