2015-05-12 2 views
0

Так странно. У меня есть модель, состоящая из person и List<person>. когда пользователь отправляет представление обратно контроллеру, person добавляет к List<person>, а затем мы снимаем все поля person с помощью person=new Person();.Странное поведение с моделями

Я бы ожидал, что при возврате к просмотру все поля person будут очищены, а представление будет «новым». Однако, по какой-то причине, я не могу понять, что большинство полей для person по-прежнему заполняются предыдущими значениями (даже после person=new Person();).

Модель представляет собой сложную модель, состоящую из нескольких «объектов объектов», а некоторые объекты наследуются от других объектов. Тем не менее, я не могу понять, почему представление все еще показывает значения из предыдущих сообщений.

EDIT !!!!!

Я отправляю сообщение в регулярном виде (HTML.BeginForm()). Так вот мой контроллер:

[HttpPost] 
    [ValidateAntiForgeryToken()] 
    public ActionResult sendInscriptorRequest(inscriptionModel _model) 
    { 
     var _umbracoModel = Umbraco.TypedContentAtRoot().FirstOrDefault(); 
     _model = bllInscripcion.fillModel(_model); 
     _model = _model.Map(_umbracoModel); 
     if (_model.formAction == "addParticipants") 
     { 
      _model.participants.Add(_model.newParticipant); 
      _model.newParticipant = new participantModel(); 
      _model.ui.participants.btnTotalParticipantsNumber += 1; 
      return View("addParticipants", _model); 
     } 
     else 
     { 
      _model.newParticipant = bllInscripcion.preFillParticipantContactWithInscriptorContact(_model); 
      return View("formularioInscripcion2", _model); 
     } 
    } 
+0

Это очень поможет вам увидеть ваш код после действия. – Eckert

+0

Просьба показать код контроллера, который делает это – markpsmith

+0

Также, как вы получаете данные? Через запрос Ajax? Стандартная форма POST? – nik0lias

ответ

3

Вы пытаетесь вернуть вид с моделью от метода POST действия. Это не сработает, потому что предполагаемое поведение - вернуть состояние модели, которое было опубликовано, чтобы пользователь мог внести исправления.

Если вы отправляете данные, а затем хотите вернуть пустой вид, вы должны перенаправить на метод действия GET, который возвращает начальное состояние представления. Он известен как шаблон Post-Redirect-Get.

http://en.wikipedia.org/wiki/Post/Redirect/Get

После этого шаблона будет также решить проблему пользователя освежающих страниц, следуя POST и получают, что раздражает диалоговое окно с надписью «Вы собираетесь повторно данные. Вы уверены?» на который пользователь всегда отвечает «Да», а затем ваша система должна иметь дело с потенциальным дублированием.

+0

СПАСИБО ВАМ ОЧЕНЬ МНОГО Крейга и @mattytommo. В итоге я использовал шаблон PRG. БОЛЬШОЙ +1 за ваши ответы и мою вечную благодарность за ваш вклад (и извините за мой плохой английский). – aplon

2

Объяснение проблемы:

Это из-за ModelState. По умолчанию MVC сохраняет состояние модели в результате действия post, если вы возвращаете один и тот же вид. Чтобы предотвратить это, просто очистить его перед возвращением вида:

ModelState.Clear(); 

Это будет означать, что все модели вы передаете обратно в режиме будет использоваться, а не один хранится в модели состоянии.

ОТКАЗ:

Вы должны использовать ModelState.Clear только тогда, когда это необходимо. Судя по вашему коду, вам не нужно его использовать. Простое перенаправление на другую страницу после того, как вы выполнили необходимую логику, лучше сделать здесь (согласно шаблону PRG).

+2

'ModelState.Clear()' является ядерным вариантом. Я бы не рекомендовал это использовать, поскольку 99 раз из 100 человек используют его в сценариях, где его фактически не следует использовать. Использование 'ModelState.Remove' для простого удаления конкретного свойства намного предпочтительнее, но лучшим решением является просто следовать Post-Redirect-Get. –

+0

@ChrisPratt Согласен, что PRG - лучшее решение, но есть сценарии, в которых «ModelState.Clear()» полезен (я бы сказал, что намного больше из 1 в 100 :)) – mattytommo

+1

Учитывая, что мне никогда не приходилось используйте его один раз за более чем 2 года работы с MVC, я бы сказал, что намного меньше. –

Смежные вопросы