即使我通过另一个模型,Ajax.BeginForm 响应也包含以前的值

Posted

技术标签:

【中文标题】即使我通过另一个模型,Ajax.BeginForm 响应也包含以前的值【英文标题】:Ajax.BeginForm response contains previous values even if I pass another model 【发布时间】:2011-11-29 22:40:27 【问题描述】:

我有一个简单的动作:

 [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);
    

因此,如果接收到的数据验证良好,则返回带有空反馈实体的部分视图。 问题是,如果我查看萤火虫响应,我看到旧值又回来了,这有多奇怪?

表格如下:

@using (Ajax.BeginForm(MVC.Feedback.New(), new AjaxOptions UpdateTargetId = "contactsForm", HttpMethod =“发布” ))

@html.LabelFor(x => x.FirstName) @Html.EditorFor(x => x.FirstName) @Html.ValidationMessageFor(x => x.FirstName)

@Html.LabelFor(x => x.LastName) @Html.EditorFor(x => x.LastName) @Html.ValidationMessageFor(x => x.LastName)

@Html.LabelFor(x => x.Email) @Html.EditorFor(x => x.Email) @Html.ValidationMessageFor(x => x.Email)

@Html.LabelFor(x => x.Phone) @Html.EditorFor(x => x.Phone) @Html.ValidationMessageFor(x => x.Phone)

@Html.LabelFor(x => x.Comments) @Html.TextAreaFor(x => x.Comments, new cols = 60, rows = 10 ) @Html.ValidationMessageFor(x => x.Comments)

if (Model.SuccessfullyPosted) 反馈发送成功。

是否有可能以某种方式禁用此行为以及PartialView(MVC.Shared.Views._FeedBackForm, model) 如何设法获得不同的模型?

更新:我看到 *** 从视图中吃掉了所有 html,但找不到解决方法。

【问题讨论】:

【参考方案1】:

ModelState 是模型值的主要供应商。即使您将模型传递给ViewPartialViewEdiorFor 也会首先查看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 链接了解相关情况的示例

【讨论】:

以上是关于即使我通过另一个模型,Ajax.BeginForm 响应也包含以前的值的主要内容,如果未能解决你的问题,请参考以下文章

Ajax.BeginForm 验证模型

jQuery.Ajax与Ajax.beginform一起使用不引人注目的JavaScript

在 Ajax.BeginForm 中传递 UpdateTargetId 不替换目标

ASP.NET MVC 3 Ajax.BeginForm 意外重置模型值

通过 ActionLink 提交 Ajax.BeginForm

使用目标 AJAX 和 ASP 将复杂模型传递给控制器