需要有关MVC中我的AJAX表单流程的建议

时间:2011-10-04 15:11:02

标签: c# asp.net-mvc ajax asp.net-mvc-3

我需要一些关于如何编写应用程序的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调用的整个流程或完全不同?

2 个答案:

答案 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');
    }
}