我遇到了一个问题,我希望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表达式解析为不同值的预期行为是什么?为什么呢?
答案 0 :(得分:2)
出现不同行为的原因是因为HiddenFor
正在从ModelStateCollection
中撤出。这是一个输入,因此这是框架首先看到的地方。
DisplayFor
没有尝试渲染任何类型的输入,选择,textarea等。它只是吐出值。因为它不是任何类型的输入,所以它不关心ModelStateCollection
。
如果您考虑普通Web应用程序的流程,则会向您显示需要填充的表单。完成后,您将提交表单,然后您将被带到一个全新的页面(具有新状态),或者您将返回当前页面进行更改或查看数据。在大多数情况下,显示用户刚刚在其请求中提交的数据是有意义的。