Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# jQuery 1.11.3 Post接收到错误的请求,但没有失败_C#_Jquery_Asp.net Mvc_Umbraco - Fatal编程技术网

C# jQuery 1.11.3 Post接收到错误的请求,但没有失败

C# jQuery 1.11.3 Post接收到错误的请求,但没有失败,c#,jquery,asp.net-mvc,umbraco,C#,Jquery,Asp.net Mvc,Umbraco,jQuery 1.11.3 Post接收到来自HttpResponseMessage的错误请求,但没有失败。来自服务器的消息是以下字符串: “状态代码:400,原因短语:'错误请求',版本:1.1,内容: ,标题:{}” 我是否应该从HttpResponseMessage返回一个表示请求错误的对象?我正在使用IIS Express 后端: [HttpPost] public HttpResponseMessage DeleteOrderRow(int orderRowId) { var

jQuery 1.11.3 Post接收到来自HttpResponseMessage的错误请求,但没有失败。来自服务器的消息是以下字符串:

“状态代码:400,原因短语:'错误请求',版本:1.1,内容: ,标题:{}”

我是否应该从HttpResponseMessage返回一个表示请求错误的对象?我正在使用IIS Express

后端:

[HttpPost]
public HttpResponseMessage DeleteOrderRow(int orderRowId)
{
    var row = OrderRowData.LoadItem(orderRowId);
    if (row == null)
    {
        AddAlert(AlertStyles.Danger, "Order row does not exist");
        //Below is the example being returned
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    OrderRowData.Delete(orderRowId);
    AddAlert(AlertStyles.Success, "Order row has been removed");
    return new HttpResponseMessage(HttpStatusCode.OK);
}
jQuery:

$(document).on('click', '.delete-order-row', function (event) {
    event.preventDefault();

    var element = $(this);
    var id = element.data('id');

    if (id == null || id === -1) {
        element.closest('tr').remove();
    } else {
        var url = element.attr('href');
        $.post(url, { orderRowId: id })
            .done(function (data) {
                element.closest('tr').remove();
            })
            .fail(function (xhr, status, error) {
                location.reload();
            });
    }
});
更新:在@smoksnes提示后检查了网络连接。即使
返回新的HttpResponseMessage(HttpStatusCode.BadRequest),服务器实际发送200 OK从后端发送。这是IIS Express的正常行为吗

更新2:使用此代码在客户端解决了此问题。根据@smoksnes回复,我怀疑我的项目中不存在
IEExceptionFilter
ExceptionFilterAttribute
。在翁布拉科还有其他人经历过吗

.done(function (data) {
    if (data.indexOf("StatusCode: 400") !== -1) {
        $(window).scrollTop(0);
        location.reload();
    } else {
        element.closest('tr').remove();
    }
})
这是IIS Express的正常行为吗

在空白项目中,这将返回
400错误请求

但正如我在评论中提到的,根据网络选项卡中的信息,您似乎得到了一个
200 OK
。这就是导致客户端脚本输入
done()
的原因。这可能是由自定义筛选器引起的

检查项目中的
IEExceptionFilter
ExceptionFilterAttribute

常见的解决方案是在Gobal.asax中添加这些过滤器:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);


public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute()); // Or whatever filter you got.
        filters.Add(new AjaxExceptionLoggingFilter());
    }
}
他们可以将响应更改为
200 OK

此外,根据url,您似乎正在使用Umbraco。我对它不是很熟悉,但那里可能有一些魔力。如果无法在服务器端解决,则可以在客户端解决:

   //Quick fix (dirty)
   $.post(url, { orderRowId: id })
        .done(function (data) {
            if(data.StatusCode != 200)
            {
                // do error stuff..
                return;
            }
            element.closest('tr').remove();
        })
        .fail(function (xhr, status, error) {
            location.reload();
        });
或与

或延期付款:

$.ajaxPrefilter(function(opts, originalOpts, jqXHR) {
    // you could pass this option in on a "retry" so that it doesn't
    // get all recursive on you.
    if ( opts.retryAttempt ) {
        return;
    }

    var dfd = $.Deferred();

    // if the request works, return normally
    jqXHR.done(function(result){
        // Maybe check for result != null?
        if(result.StatusCode != 200) {
            dfd.reject() // Manually reject
        }
        else {
            dfd.resolve(result);
        }

    });

    jqXHR.fail(dfd.reject);

    // NOW override the jqXHR's promise functions with our deferred
    return dfd.promise(jqXHR);
});

可以找到一个更完整的示例,该示例使用了
ajaxPrefilter

我认为问题在于您返回了一条HttpResponseMessage,每次都应该抛出一个响应异常:

var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);

用这段代码在客户端解决了这个问题。根据@smoksnes回复,我怀疑我的项目中不存在
IEExceptionFilter
ExceptionFilterAttribute

.done(function (data) {
    if (data.indexOf("StatusCode: 400") !== -1) {
        $(window).scrollTop(0);
        location.reload();
    } else {
        element.closest('tr').remove();
    }
})

检查服务器是否在“网络”选项卡中实际返回400作为状态代码。我见过一些返回200的实现,但是JSON包含另一个状态码。我没有想到这一点,对了,服务器返回了200 OK。您知道这是否是IIS Express的正常行为吗<代码>新的HttpResponseMessage(HttpStatusCode.BadRequest)显然应该是400 imao。感谢您的明确回答。我在项目中找不到
IEExceptionFilter
ExceptionFilterAttribute
。不过,我正在使用Umbraco,这可能是问题所在。谢谢@smoksnes,已经做了客户端修复。不幸的是,响应甚至不是一个对象,所以我必须检查“StatusCode:400”字符串。您可以在我的问题中查看我是如何做到这一点的。@Ogglas,Umbraco IMO提供的一个非常奇怪的解决方案。如果您想要一个更通用的解决方案,您可以使用ajaxPrefilter。然后,您的所有请求将再次表现为“正常”。这无法100%工作,但会失败,这是因为服务器响应HTTP 500内部服务器错误消息。请尝试将DeleteOrderRow函数的返回类型修改为IHttpActionResult,然后返回BadRequest(“订单行不存在”);(或为了成功Ok());
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);
.done(function (data) {
    if (data.indexOf("StatusCode: 400") !== -1) {
        $(window).scrollTop(0);
        location.reload();
    } else {
        element.closest('tr').remove();
    }
})