ASP.NET MVC 3 HtmlHelper.Textbox Использует ModelState в качестве источника значения? - PullRequest
1 голос
/ 04 октября 2011

У меня есть текстовое поле, в котором я обрезаю значение на стороне сервера в установщике 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 заменяют значения модели представления.

1 Ответ

3 голосов
/ 04 октября 2011

Это было разработано таким образом, потому что предполагается, что если вы не перенаправляете в другое представление после публикации. Следовательно, шаблон post-redirect-get, то в идеале произошла ошибка, и текущие опубликованные значения будут показаны обратно впользователь для них, чтобы исправить, следовательно, почему они вытащили из состояния модели.Вы можете использовать ModelState.Clear для работы с этим, но помните об этом дизайне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...