使用jQuery Form插件检测错误响应(ajaxForm)

时间:2010-12-08 17:19:15

标签: jquery asp.net-mvc error-handling httpresponse ajaxform

我正在使用jQuery Form插件来调整文件上传控件。我正在返回我要加载到div中的html。

我在检测错误情况时遇到了问题。

我有以下ASP.NET MVC控制器方法:

public ActionResult UploadDocument(int id)
{
    try
    {
        // ...blah
    }
    catch(Exception e)
    {
        // log e

        // these two lines are what I can't get working
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return null;
    }
    return PartialView("blah", model);
} 

和jQuery

$documentForm.ajaxForm({
    beforeSubmit: function() { ... },
    success: function(response, status, xhr) {

        if (status == "error") {
            // this doesn't work, status is still "success"
        }

        if (!response || response == '') {
            // this doesn't work either, as the html response
            // seems to get wrapped in a <pre> tag
        }

        // this line is fine if the controller call was a success
        $container.find('.documentHistory').html(response);
    }   

如何从服务器响应中提醒客户端错误?

2 个答案:

答案 0 :(得分:3)

在您的成功功能之后,添加以下内容:

error: function(request, status, error) {
    // Boil the ASP.NET AJAX error down to JSON.
    //var err = eval("(" + request.responseText + ")");
    // Display the specific error raised by the server
    if (request.responseText == '') {
        var loader = this;
        setTimeout(function() { $.ajax(loader); }, 150);
        //console.log(status + " : " + request.statusText + " : " + request.status);
    }
    else {
        console.log(request.responseText);
        // or populate a div with the error in bright RED :)
    }
}

应该适合你。

答案 1 :(得分:3)

恐惧,

这是我对jquery ajaxform插件的修改实现:

(function($) {
    $.fn.ajaxify = function(options) {

        // Defaults and options
        var defaults = {
            method: '',
            action: '',
            dataType: null, // i.e. json, jsonp etc
            target: null, // target div for ajax return data
            errordiv: null,
            // callback functions
            onBeforeSend: function() { },
            onSubmit: function() { return true },
            onSuccess: function() { },
            onError: function() { }
        };
        var opts = $.extend({}, defaults, options);

        this.each(function() {
            $(this).bind('submit', function(event) {

                event.preventDefault();

                // Increase readability && scope
                FORM = $(this);

                // Mimic the normal onSubmit handler
                if (!opts.onSubmit.call(FORM[0])) { return; }

                // Determine the method && action
                var method = opts.method || FORM.attr('method') || 'GET';
                var action = opts.action || FORM.attr('action');
                var dataType = opts.dataType || "text";
                var target = opts.target || null;
                var errordiv = opts.errordiv || null;

                // Submit the form via ajax, with appropriate callback
                $.ajax({
                    type: method,
                    url: action,
                    data: FORM.serialize(),
                    dataType: dataType,
                    beforeSend: function() {
                        opts.onBeforeSend(FORM[0]);
                    },
                    success: function(data) {
                        if (target != null)
                            opts.onSuccess.call(FORM[0], data, target);
                        else
                            opts.onSuccess.call(FORM[0], data);
                    },
                    error: function(request, status, error) {
                        // Boil the ASP.NET AJAX error down to JSON.
                        //var err = eval("(" + request.responseText + ")");
                        // Display the specific error raised by the server
                        if (request.responseText == '') {
                            var loader = this;
                            setTimeout(function() { $.ajax(loader); }, 150);
                            //console.log(status + " : " + request.statusText + " : " + request.status);
                        }
                        else {
                            if (errordiv != null)
                                opts.onError.call(FORM[0], request.responseText, errordiv);
                            else
                                opts.onError.call(FORM[0], request.responseText);
                        }
                    }
                });
            });
        });

        // allow chaining
        return this;
    }
})(jQuery);

用法(<form id="ajaxify" method="post" action="<%=Url.Action("Test") %>">等等......:

$(document).ready(function() {
    var options = {
        onSubmit: myOnSubmit,
        onBeforeSend: myBefore,
        onSuccess: myOnSuccess,
        onError: myOnError,
        target: "#myDiv",
        errordiv: "#errDiv"
    };
    $('#ajaxify').ajaxify(options);
});

function myOnSubmit() {
    var valid = true;
    var FORM = $(this);

    FORM.find('input').css('border-color', '#F0F0F0');
    // fake validation just to demonstrate
    FORM.find('input').each(function() {
        if ($(this).val() == '') {
            $(this).css('border-color', 'red');
            valid = false;
        }
    });
    return valid;
}

function myBefore() {
    alert("we");
}

function myOnSuccess(msg, target) {
    if (target == null) {
        // this could also be a manually entered target
        // i.e. $("#myTargetDiv").html(msg);
        alert("no target");
    }
    else
        //alert($(target).html());
        $(target).html(msg);
}

function myOnError(errorText, errorDiv) {
    $(errorDiv).html(errorText);
}
希望,这应该让人深思......