Состояние и ASP.NET MVC3

У меня есть простое приложение asp.net MVC 3 со страницей с формой и @Html.Hidden("hiddenField"). Я изменяю значение hiddenField через JavaScript, когда форма отправляется в зависимости от ввода, мне, возможно, придется вернуться к тому же представлению, но когда я это делаю, скрытое поле предварительно заполняется значениями из сообщения.

Как это возможно. Насколько я понимаю, программист несет полную ответственность за поддержание состояния с помощью asp.net MVC. или класс Helper автоматически устанавливает значение на основе значений запроса?


person Jonas Stawski    schedule 28.02.2011    source источник
comment
По-видимому, ваше скрытое поле сохраняется в базе данных при отправке (что является ожидаемым поведением, если вы правильно спроектировали свое приложение). Затем, когда вы вернетесь к тому же представлению, оно будет предварительно заполнено предыдущими значениями из базы данных.   -  person Robert Harvey    schedule 28.02.2011
comment
Здесь нет сохранения БД, и я не возвращаюсь к представлению по умолчанию. Я возвращаю View() из действия, которое обрабатывает HttpPost   -  person Jonas Stawski    schedule 01.03.2011


Ответы (3)


Это связано с тем, что при связывании вспомогательных функций HTML сначала используются значения в ModelState, а затем в модели. Поэтому, если вы собираетесь изменить значение внутри действия контроллера POST, которое было опубликовано, вам необходимо удалить его из состояния модели. Пример:

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    model.SomePropertyThatYouWantToModify = "some new value";
    return View(model);
}

Теперь ваш @Html.HiddenFor(x => x.SomePropertyThatYouWantToModify) отобразит новое значение.

И для полноты моего ответа, если вы используете ViewData (но я очень надеюсь, что это не так):

[HttpPost]
public ActionResult Index(FormCollection form)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    ViewData["SomePropertyThatYouWantToModify"] = "some new value";
    return View();
}

и, по вашему мнению, @Html.Hidden("SomePropertyThatYouWantToModify") должно отображать новое значение.

person Darin Dimitrov    schedule 28.02.2011
comment
потратил 3 часа на то, чтобы выяснить, почему это не работает в моем примере, вынул из него ModelState.Clear(), я знал, что это было не просто так :) - person Bek Raupov; 12.08.2011

Это может быть проблема с привязкой модели. Если скрытое поле, сгенерированное вашим вызовом @Html.Hidden("hiddenField"), не имеет имени, которое компоновщик модели может распознать как свойство вашей модели, оно будет использовать значение, заполненное любым вашим процессом, который строит модель (при условии, что вы строите модель). модели и обновил только поля, опубликованные вашим представлением).

Исходя из вашего примера, имя свойства вашей модели должно быть точно hiddenField.

person Josh Anderson    schedule 28.02.2011

Я думаю, что есть проблема в том, как MVC 3 справляется с этим. Если я покажу значение своей модели, как в <h3>QuestionType: @Model.QuestionType</h3>, оно покажет новое значение. Но в скрытом поле у ​​него старое значение. @Html.HiddenFor(m => m.QuestionType);

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

Ответ Дарина выше решает мою проблему. Я просто использую ModelState.Clear() перед возвратом представления, и все работает нормально.

person Brian    schedule 13.07.2011