我正在使用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);
}
如何从服务器响应中提醒客户端错误?
答案 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);
}
希望,这应该让人深思......