我对我的控制器进行了ajax调用,然后调用一个返回true或false的服务。我似乎无法弄清楚为什么当从控制器返回到视图时,这总是触发我的成功函数。
控制器
[HttpGet]
public JsonResult TagUnit(int id, string selectedItem)
{
try
{
var result = UnitClient.TagUnit(id, selectedItem);
if (!result)
{
throw new InvalidOperationException();
}
return Json(new {success = true}, JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
return Json(new {success = false}, JsonRequestBehavior.AllowGet);
}
}
Cshtml - Javascript - Ajax
.on("select2-selecting", function (e) {
var url = '@Url.Content("~/UnitDetails/TagUnit/" + Model.ViewUnitContract.Id)';
var id = e.val;
var tagName = e.object.text;
console.log(id + " : " + tagName);
$.ajax({
url: url,
data: { selectedItem: tagName },
type: 'GET',
dataType: 'json',
success: function () {
alert('Success');
},
error: function () {
alert('Error');
}
});
}).select2('val', ['1', '2']);
我在这里缺少什么?
答案 0 :(得分:3)
您应该以成功方法验证服务器结果数据。
$.ajax({
url: url,
data: { selectedItem: tagName },
type: 'GET',
dataType: 'json',
success: function (data) {
if (data != null && data.success) {
alert('Success');
} else {
alert('Error');
}
},
error: function () {
alert('Error');
}
});
错误方法调用如果在服务器上发生500错误或服务器不可用等等。
答案 1 :(得分:0)
我认为如果你抛出异常,它仍然会返回成功状态代码。所以我所做的是创建一个可以附加到MVC方法的ajax调用错误处理程序属性。它将捕获未捕获的异常,设置错误状态代码并提供一般错误消息(并且还记录到Elmah)。该属性位于
之下public class HandleJsonErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
var serviceException = filterContext.Exception as Exception;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult
{
Data = new
{
errorMessage = "Generic error message",
errorType = 0
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
var kayttaja = (Kayttaja.TKayttajantiedot)filterContext.HttpContext.Session["userKayttajanTiedot"];
Global.HandleApplicationError(serviceException, kayttaja);
filterContext.ExceptionHandled = true;
// Log to elmah
//Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception);
}
}
然后装饰你的动作方法,这些方法只能由Ajax用[Campus.Attribuutit.HandleJsonError]
在ajax调用对象中触发错误处理程序的重要行是HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError
答案 2 :(得分:0)
不知道我是否理解你的问题。
如果请求成功,将在Ajax中执行成功功能。如果请求失败,将执行错误功能。您必须检查服务器在成功函数内返回的内容。