2011-10-03 29 views
1

我有我修剪在視圖模型的setter服務器端的價值,並覈實該修剪值存在一個文本框:ASP.NET MVC 3 HtmlHelper.Textbox使用ModelState作爲值的來源?

<Required()> 
    Public Property Name As String 
     Get 
      Return Me.mName 
     End Get 
     Set(value As String) 
      Me.mName = value.Trim() 
     End Set 
    End Property 

在控制器中,我檢查,看看是否的ModelState是無效的,如果是,我再次顯示該視圖:

If (Not ModelState.IsValid) Then 
     Return View("Locations", viewModel) 
    End If 

在修剪值爲空的情況下,我將該表單重新顯示給用戶。此時,未修剪的值將被放入文本框中。我更喜歡修剪的價值。

我正在查看MVC源代碼,發現InputHelper函數中的某一點(由位於InputExtensions.cs中的Html.Textbox()使用)代碼檢查ModelState的值,如果它存在,取代了控制器提供的價值。

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

我意識到,我可以在控制器清除的ModelState解決這個問題,但我只是想知道,爲什麼MVC開發者選擇在該ModelState中值取代視圖模型值。

+0

這是一個設計決定,只有ASP.NET MVC開發人員/架構師可以回答(因爲他們是設計您所問的框架的人)。 SO不是問這些問題的正確的地方。請直接向您使用的軟件的編輯(您的情況是Microsoft)編輯。 –

+2

我並沒有詢問代碼的設計。我正在詢問MVC團隊有意實施的特定功能。我想知道這個對應的MVC的具體功能。 –

+0

你問爲什麼Html幫助者在綁定它們的值時首先查看ModelState,然後在視圖模型值處查看,並且這個問題的答案是(正如你已經通過查看源代碼已經發現的那樣):* by design *。設計者設計這種框架的原因可以由框架設計者自己最好地回答。 –

回答

3

這是這樣設計的,因爲假設是,如果你沒有重定向到另一個視圖後..因此,後重定向獲取模式,那麼理想情況下是一個錯誤,當前張貼值將顯示回來給用戶讓他們修復,爲什麼他們從模型狀態中拉出來。你可以使用ModelState.Clear來處理這個問題,但要記住這個設計。