【发布时间】: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