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



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

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

首先这样设置你的OnSuccess:

OnSuccess = "UpdateSuccessful(data)"

然后你的javascript函数如下:

function UpdateSuccessful(data) {
    if (data.indexOf("field-validation-error") > -1) return;
    // Do your valid stuff here
}

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

    public ActionResult SaveDetails(Project model)
    {
        if (ModelState.IsValid)
        {
            model.SaveProject();
        }
        return PartialView("ProjectForm", model);
    }

在你的AjaxOptions中:

UpdateTargetId = "FormContents"

现在只要确保你有一个divid="FormContents"的东西,无论你想要你的表单显示

这正常吗?

当然可以。如果服务器发送HTTP 200,则调用OnSuccess方法。模型状态有效性的概念仅存在于服务器端。只要你的控制器动作返回一些视图/部分/json/…OnSuccess将触发。如果在控制器操作中抛出异常,则触发OnError而不是OnSuccess。

为了处理这种情况你可以让你的控制器动作做一些类似的事情:

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

然后:

function success(result) {
    if (result.success) {
        // the model was valid
    } else {
        // the model was invalid
    }
}

现在,在无效模型的情况下,您可能希望通过刷新表单向用户显示错误消息。在这种情况下,您可以做的是将表单放在partial中,并且在无效模型状态的情况下,您将从控制器动作返回partialview,并在成功的情况下返回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
    }
}

您可以这样做:

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

Luis的回答略有不同:

function OnSuccess() {
    if ($("span[class='field-validation-error']").length == 0) {
        alert("Target Platform saved Successfully.");
    }
}

我返回一个错误的请求而不是视图,以确保ajax调用返回onfail而不是onsuccess。

在xhr。您可以找到写在错误请求中的字符串,并正确管理onfail事件。

服务器端:

if (!ModelState.IsValid)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Model not valid");
        }

客户端:

$.ajax({
        url: '',
        method: 'POST'            
       }).fail(function (xhr) {
           alert(xhr.statustext);
       });

最新更新