Asp.net mvc MVC以不同于DisplayFor的方式处理HiddenFor的lambda

Asp.net mvc MVC以不同于DisplayFor的方式处理HiddenFor的lambda,asp.net-mvc,Asp.net Mvc,我遇到了一个问题,我希望Html.HiddenFor解析模型中的id,并发现ModelStateCollection是根据查询参数、post数据以及您的模型构建的(如本文所讨论的) 但我不明白的是,为什么Html.DisplayFor解析与HiddenFor解析不同。这是我的密码: // Model public class FooModel { public int id { get; set; } } // Controller public ActionResult Foo(in

我遇到了一个问题,我希望Html.HiddenFor解析模型中的id,并发现ModelStateCollection是根据查询参数、post数据以及您的模型构建的(如本文所讨论的)

但我不明白的是,为什么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>
}    
//模型
公共类模型
{
公共int id{get;set;}
}
//控制器
公共行动结果Foo(int-id)
{
var模型=新模型{id=111};
返回视图(模型);
}
//形式
@模型MVCProject.Models.FooModel
@使用(Html.BeginForm())
{
食品模型
@Html.HiddenFor(model=>model.id)
ID:@Html.DisplayFor(model=>model.ID)

}
请求/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>

身份证号码:111


HiddenFor和DisplayFor是否会将其lambda表达式解析为不同的值?为什么?

出现不同行为的原因是
HiddenFor
正在从
ModelStateCollection
中提取。这是一个输入,因此,这是框架首先考虑的地方

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

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