MVC处理lambda for HiddenFor与DisplayFor不同

时间:2013-05-16 00:20:15

标签: asp.net-mvc

我遇到了一个问题,我希望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表达式解析为不同值的预期行为是什么?为什么呢?

1 个答案:

答案 0 :(得分:2)

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

DisplayFor没有尝试渲染任何类型的输入,选择,textarea等。它只是吐出值。因为它不是任何类型的输入,所以它不关心ModelStateCollection

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