2013-05-16 26 views
2

我遇到了一個問題,我期待Html.HiddenFor從我的模型中解析id,並發現ModelStateCollection是從查詢參數,發佈數據以及您的模型(如這裏討論的https://stackoverflow.com/a/8749419/910348)。MVC處理lambda for HiddenFor與DisplayFor不同

但我不明白的是爲什麼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 /美孚/ 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表達式爲不同的值?爲什麼?

回答

2

之所以存在不同的行爲是因爲HiddenFor是從ModelStateCollection拉。這是一個輸入,因此這是框架首先要考慮的地方。

DisplayFor不會嘗試呈現任何類型的輸入,select,textarea等。它只是吐出價值。因爲它不是任何類型的輸入,所以它不關心ModelStateCollection

如果您考慮正常的Web應用程序的流程,那麼您將看到需要填充的表單。完成後,您提交表單,然後將您帶到全新的頁面(具有新的狀態),或者返回到當前頁面進行更改或查看數據。在大多數情況下,顯示用戶在他們的請求中剛剛提交的數據是有意義的。