【问题标题】:MVC - Update model in view after ajax form submitMVC - 提交ajax表单后更新视图中的模型
【发布时间】:2016-02-07 00:46:56
【问题描述】:

我有一个关于 MVC4 的问题。我有一个通过 ajax 提交给我的控制器的表单。在控制器中,我使用表单的数据在数据库中创建一个新条目。

  • 如果成功,表单字段需要清空,并且应该会出现一条消息,表明已添加记录。以便用户准备好通过表单添加下一项。我可以通过javascript(通过“OnSuccess”调用)清除“ResetView”方法中的字段,这不是问题
  • 如果出现错误,表单字段需要保持填写状态,并且应该显示一条消息,表明它失败了。就我而言,它还调用“OnFailure”方法“ShowError”(仅显示 div“CustomerMessage”)。

当项目失败时我遇到的问题是我的模型中的“CustomMessage”是空的,而我确实在我的控制器中明确设置了它。所以在我看来,@Model.CustomMessage 总是空的!

我读到我应该在我的控制器中调用“ModelState.Clear()”函数,但这似乎没有任何作用。 有人可以检查我的代码有什么问题吗?

非常感谢任何帮助。

查看:

<div id="createform">
@using (Ajax.BeginForm("Create", "Payment", new { username = User.Identity.Name }, new AjaxOptions
{
    HttpMethod = "POST",
    UpdateTargetId = "createform",
    //OnBegin = "SubmitForm",
    OnSuccess = "ResetView",
    OnFailure = "ShowError"
}))
{      
   <div id="CustomMessage">@Model.CustomMessage</div>
   ... bunch of @Html.TextBoxFor stuff (like below) ...
   @Html.TextBoxFor(model => model.SenderName, new { id = "SenderName"})
}
</div>

控制器:

[HttpPost]
public ActionResult Create(PaymentViewModel payment, string username)
{
        if (ModelState.IsValid)
        {
            try
            {
                paymentRepository.AddPayment(payment.PaymentLine, username);
                paymentRepository.SaveChanges();

                payment.CustomMessage = "success";
            }
            catch (Exception ex)
            {
                payment.CustomMessage = "error";
            }
        }
        else
        {
            payment.CustomMessage = "error";
        }

        ModelState.Clear();
        return PartialView(payment);
}

【问题讨论】:

  • ModelState.Clear() 与此无关。你永远不会点击你的 OnFailure() 函数,因为服务器上没有任何故障 - 你所做的只是返回一个局部视图(不返回 HttpException)
  • 嗨,好的,但是如果我总是显示 div“CustomMessage”(无论成功还是失败),即使这样 @Model.CustomMessage 也是空的。虽然我希望它在提交表单后具有“成功”或“错误”的值。但知道这可能是什么原因吗?
  • 您没有显示代码 ResetView()ShowError() - 您是如何“显示”错误的?
  • 你为什么要重新更换表格?使用 ajax 几乎没有任何意义,因为您没有获得任何性能优势。您应该只返回消息 (ContentResult) 并使用 UpdateTargetId = "CustomMessage"
  • 嗨,如果我只返回 ContentResult,我会丢失我的表单条目。因此,如果出现问题,所有字段都会再次为空,用户需要再次键入所有内容。我想避免这种情况。对于 ResetView() 或 ShowError() 的代码,我暂时将它们留空。我只想知道为什么我在控制器中返回视图后@Model.CustomMessage 的值为空

标签: asp.net ajax asp.net-mvc-4


【解决方案1】:

我发现了问题。似乎我错过了对 jquery unobtrusive ajax 脚本的引用。添加后,一切正常

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多