2010-03-19 27 views
3

post問這個問題,但並沒有真正給出答案,所以我想我會以不同的方式提出問題。爲什麼輸入元素不會呈現在ASP.Net MVC中傳遞的值?

我有一個頁面,呈現從模型中的隱藏的價值:

<%=Html.Hidden("myName", model.myValue) %> 

因爲我在值參數傳遞的值,你會覺得它會輸出值,但事實並非如此。

渲染輸入域代碼有以下幾點:

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string)); 
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue); 

基本上,如果ModelState中(其中包含公佈值)包含通過了「名」的值,它會使用該值,而不是你的將值傳遞給輔助方法。在我的情況下,我更新了模型,我的更新值沒有輸出。

如果我傳遞一個值給一個方法,我期望這個值被渲染。

我錯過了這個設計中的東西還是它錯了?

回答

2

這是設計。這裏是預期流程:

  1. 用戶請求某個URI。
  2. 您的控制器構建了一個模型。
  3. 呈現視圖。此時,ModelState字典應該是空的,所以您傳遞給Html.Hidden的值將被渲染。但是,所討論的功能與用戶輸入更直接相關,因此請考慮以下情況:Html.TextBox("someName", Model.SomeValue)
  4. 現在想象用戶輸入一些無效數據。如果你有一個客戶端驗證,這將在POST之前被捕獲,但是讓我們假裝你沒有,或者用戶有某種方式繞過它。

在這種情況下,處理POST的動作將返回一個ViewResult,導致來自步驟3的視圖被重新渲染。但是,用戶將看到他們輸入的值(以便他們可以修復它)而不是來自模型對象的值。這裏的想法是,由於類型安全,用戶輸入的數據可能不能表示爲Model.SomeValue中的值。例如,如果Model.SomeValue是整數類型,並且用戶輸入了「ABC」,則重新呈現用戶數據的唯一方法是將其放在其他位置。而「別的地方」就是ModelState。

重新顯示用戶的無效數據允許用戶修復他們輸入的數據並重新發布表單。

+0

我同意所有輸入控件,但隱藏不是可見的輸入控件。所以不應該隱藏行爲不同? – 2010-03-19 15:05:30

+0

MVC無法知道您的隱藏輸入是如何使用和設置的。也許你在頁面上有一個JavaScript GUI控件,它讀/設置一個隱藏的輸入來與服務器通信? MVC一致對待所有表單元素。 – 2010-03-19 15:22:10

相關問題