Ответ Ajax.BeginForm содержит предыдущие значения, даже если я передам другую модель - PullRequest
2 голосов
/ 03 октября 2011

У меня есть простое действие:

 [HttpPost]
    public virtual ActionResult New(Feedback feedback)
    {
        feedback.CreatedDate = DateTime.UtcNow;

        if (TryValidateModel(feedback))
        {
            FeedbackRepository.Add(feedback);
            var model = new Feedback
                            {                                   
                                SuccessfullyPosted = true
                            };

            return PartialView(MVC.Shared.Views._FeedBackForm, model);
        }

        return PartialView(MVC.Shared.Views._FeedBackForm, feedback);
    }

Итак, идея в том, что если полученные данные проверяются нормально, вернуть частичное представление с пустой сущностью обратной связи.Дело в том, что если я посмотрю на ответ firebug, я увижу старые значения, возвращающиеся, как странно это?

Форма выглядит так:

@using (Ajax.BeginForm(MVC.Feedback.New(), new AjaxOptions
                                                                 {
                                                                     UpdateTargetId = "contactsForm",
                                                                     HttpMethod = "post"
                                                                 }))
{           
    
        <br />
            
    <p>
        @Html.LabelFor(x => x.FirstName)
        @Html.EditorFor(x => x.FirstName)
        @Html.ValidationMessageFor(x => x.FirstName)</p>
    <p>
        @Html.LabelFor(x => x.LastName)
        @Html.EditorFor(x => x.LastName)
        @Html.ValidationMessageFor(x => x.LastName)</p>
    <p>
        @Html.LabelFor(x => x.Email)
        @Html.EditorFor(x => x.Email)
        @Html.ValidationMessageFor(x => x.Email)</p>
    <p>
        @Html.LabelFor(x => x.Phone)
        @Html.EditorFor(x => x.Phone)
        @Html.ValidationMessageFor(x => x.Phone)</p>                       
    <p>
        @Html.LabelFor(x => x.Comments)<br />
        @Html.TextAreaFor(x => x.Comments, new { cols = 60, rows = 10 })
        @Html.ValidationMessageFor(x => x.Comments)
    </p>
    if (Model.SuccessfullyPosted)
    {
    
        Feedback sent successfully.</p>
    }
    <p>
        </p>
}

Возможно ли как-то отключить этоповедение и как PartialView(MVC.Shared.Views._FeedBackForm, model) удается получить другую модель?

обновление: я вижу, что stackoverflow съел весь html из вида и не может найти, как это исправить.

1 Ответ

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

ModelState является основным поставщиком значений модели. Даже если вы передадите свою модель View или PartialView, EdiorFor сначала будет искать в ModelState соответствующее значение свойства, а если его там нет, только затем в самой модели. ModelState заполняется при публикации в контроллер (старая обратная связь). Даже если вы создаете новый отзыв и передаете его как модель, ModelState уже содержит значения из ранее опубликованного отзыва, поэтому вы получаете старые значения на клиенте. Очистка состояния модели перед успешным результатом публикации поможет вам.

FeedbackRepository.Add(feedback);
var model = new Feedback
                {                                   
                   SuccessfullyPosted = true
                 };
ModelState.Clear(); // force to use new model values
return PartialView(MVC.Shared.Views._FeedBackForm, model);

См. this и this ссылки для примеров связанных ситуаций

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