У меня есть текстовое поле, в котором я обрезаю значение на стороне сервера в установщике viewModel и проверяю наличие усеченного значения:
<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 (используемой Html.Textbox (), расположенной в InputExtensions.cs) код проверял значение ModelState, и если существует, заменяя значение, предоставленное контроллером.
string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);
Я понимаю, что мог бы это исправить, очистив ModelState в контроллере, но мне просто интересно, почему разработчики MVC решили, что значения в ModelState заменяют значения модели представления.