我需要一些关于如何编写应用程序的AJAX部分的帮助/指导。
我有一个按钮,点击后会弹出一个模态对话框。在对话框中,我有一个Ajax表单,它有一个文本框和一个保存值的按钮:
@using( Ajax.BeginForm("SaveText", new AjaxOptions{ OnSuccess = "ajaxSuccess" }) )
{
@Html.TextBoxFor(m => m.Text)
<p>
<input type="submit" value="Save" />
</p>
}
当AJAX成功完成时,我想关闭对话框并刷新主页面上的网格:
function ajaxSuccess() {
closeDialog();
refreshGrid();
}
我尝试实施验证时遇到了问题。我不确定如何完成我想要的东西。这是我的控制器:
public ActionResult SaveText(SaveTextViewModel model)
{
if( ModelState.IsValid )
{
return PartialView("SaveTextPartial", model);
}
repository.SaveText(...);
return PartialView("SaveTextPartial");
}
这是我遇到困难的地方:当我提交表单并且存在验证错误时,控制器返回部分视图但AJAX OnSuccess方法完成。我不知道如何区分错误的成功和没有错误的成功。当我有验证错误时,我的表单关闭,我的网格刷新,这不是我想要的。
有没有人有任何想法?我是否需要重新调整AJAX调用的整个流程或完全不同?
答案 0 :(得分:1)
看起来你不需要这个表单就可以在没有Javascript的情况下工作(因为你总是传回部分视图),那么为什么不成功传回一个简单的JSON对象?
return Json(new { success = true })
如果出现错误,请返回部分视图,以便替换HTML。
然后在你的回调中测试它......
if (result.success) { }
这样,成功之后,您可以安全地关闭对话框,但是在验证错误时,您将对话框的HTML替换为您在AJAX请求中收到的HTML。
我不知道你的onSuccess回调有哪些参数可用,但我确定响应正文是其中之一。
答案 1 :(得分:0)
如果出现错误,您可以添加自定义HTTP标头:
public ActionResult SaveText(SaveTextViewModel model)
{
if( !ModelState.IsValid )
{
// a validation error occurred
Response.AppendHeader("X-Error", "true");
return PartialView("SaveTextPartial", model);
}
repository.SaveText(...);
return PartialView("SaveTextPartial");
}
并在客户端:
function ajaxSuccess(e, status, xhr) {
if (xhr.getResponseHeader('X-ERROR')) {
alert('failure');
} else {
alert('success');
}
}