Модель Свойство, установленное в контроллере, не отображается в поле зрения

Это довольно простой пример.

контроллер

[httppost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";
    return view(myModel)
}

Набранный вид содержит скрытое поле для someProperty

@Html.HiddenFor(model => model.someProperty)

Контроллер Get устанавливает someProperty в "a"

Однако после публикации значение someProperty в представлении все еще "a"

Это не похоже на меня. Какие-нибудь идеи? спасибо

Ответ 1

ModelState сохраняет значение "a". И поскольку он имеет более высокий приоритет при заполнении значений модели (чем сама модель), view отображает "a". Вы можете удалить значение из ModelState и использовать значение модели

[HttpPost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";

    ModelState.Remove("someProperty");    

    return view(myModel);
}

Ответ 2

Я действительно могу воспроизвести это (что меня сначала удивило), но после некоторой царапины головы я думаю, что это имеет смысл.

Установка точки останова на строке myModel.SomeProperty = "b"; показывает, что свойство задано правильно. Это заставляет меня полагать, что MVC делает предположение, основанное на том, что вы визуализируете представление как прямой результат POST (т.е. Существует существующее модельное состояние). Я бы это себе представил, потому что, если вы повторно просматриваете представление после POST, предполагается, что вы это делаете, потому что форма содержит ошибки. Извлекая значения из modelstate, форма может быть правильно перезаписана для повторения пользователем.

Изменить: И, конечно, как только я публикую, я нахожу статью, которая описывает ее лучше, чем я могу: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx