即使模型无效,ASP.NET MVC"Ajax.BeginForm"也会执行OnSuccess

Nip*_*rus 17 ajax asp.net-ajax asp.net-mvc-3

我有一个"提交反馈"表单,它使用"Ajax.BeginForm"来呈现包含表单元素的部分.即使ModelState无效,OnSuccess事件也会触发.这是正常的吗?我希望能够做一些回发导致模型无效,然后当模型有效且没有错误时,OnSuccess事件会触发?

Ser*_*gan 28

我用一个相当简单的javascript技术处理这个问题:

首先设置你OnSuccess喜欢这个:

OnSuccess = "UpdateSuccessful(data)"
Run Code Online (Sandbox Code Playgroud)

然后你的javascript函数如下:

function UpdateSuccessful(data) {
    if (data.indexOf("field-validation-error") > -1) return;

    // Do your valid stuff here
}
Run Code Online (Sandbox Code Playgroud)

这样,就没有必要弄乱你的控制器,或者更重要的是,你的控制器可以返回Partial View模型错误而不做任何奇怪的事情,即:

    public ActionResult SaveDetails(Project model)
    {
        if (ModelState.IsValid)
        {
            model.SaveProject();
        }

        return PartialView("ProjectForm", model);
    }
Run Code Online (Sandbox Code Playgroud)

在你的AjaxOptions:

UpdateTargetId = "FormContents"
Run Code Online (Sandbox Code Playgroud)

现在,只要确保你有div什么用id="FormContents",无论你想你的形式显示出来.


Dar*_*rov 18

这是正常的吗?

当然是.如果服务器发送HTTP 200,则调用OnSuccess方法.modelstate有效性的概念仅限于服务器端.只要你的控制器动作返回一些view/partial/json/...... OnSuccess就会触发.如果在控制器操作中抛出异常,则会触发OnError而不是OnSuccess.

因此,为了处理这种情况,您可以让控制器操作执行以下操作:

[HttpPost]
public ActionResult Process(MyViewModel model)
{
    if (!ModelState.IsValid)
    {
        return Json(new { success = false });
    }
    return Json(new { success = true });
}
Run Code Online (Sandbox Code Playgroud)

然后:

function success(result) {
    if (result.success) {
        // the model was valid
    } else {
        // the model was invalid
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,对于无效模型,您可能希望通过刷新表单向用户显示错误消息.在这种情况下,您可以做的是将表单放在部分内部,如果模型状态无效,您将从控制器操作返回部分视图,并在成功的情况下返回json对象.所以在你的成功处理程序中你可以测试:

function success(result) {
    if (result.success) {
        // the model was valid
    } else {
        // there were errors => show them
        $('#myform_container').html(result);
        // if you are using client side validation you might also need
        // to take a look at the following article
        // http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx
        // and reattach the client validators to the form as you are
        // refreshing its DOM contents here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢谢谢.这个答案是完美的.我很惊讶没有关于使用不引人注目的AJAX处理这种情况(模型错误)的可靠文档. (4认同)
  • 对我不起作用,因为在失败时,我必须返回一个视图,而不是JSON。 (2认同)

Lui*_*eia 5

您可以执行以下操作:

var OnSuccess = function() {
    if ($(".validation-summary-errors").length == 0) { 
        //Your javascript/jquery code goes here
    }
}
Run Code Online (Sandbox Code Playgroud)