OnDelete处理程序总是触发错误的请求

时间:2019-06-27 01:10:37

标签: ajax asp.net-core razor-pages

试图与HTTP动词更加一致,我试图通过AJAX在Razor页面上调用删除处理程序;

这是我的AJAX代码,然后是我页面上的C#代码:

return new Promise(function (resolve: any, reject: any) {
  let ajaxConfig: JQuery.UrlAjaxSettings =
  {
    type: "DELETE",
    url: url,
    data:  JSON.stringify(myData),
    dataType: "json",
    contentType: "application/json",
    success: function (data) { resolve(data); },
    error: function (data) { reject(data); }

  };

  $.ajax(ajaxConfig);
});

我的cshtml页面上的处理程序:

public IActionResult OnDeleteSupprimerEntite(int idEntite, string infoCmpl)
{
    // my code
}

永远无法到达...获得bad request代替!

当我切换到'GET'时-ajax请求的类型和处理函数的名称(OnGetSupprimerEntite)-的确像超级按钮一样工作。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

简短答案400 bad request表示请求无法满足服务器端的需求。


首先,您的服务器要求使用表单

public IActionResult OnDeleteSupprimerEntite(int idEntite, string infoCmpl)
{
  // my code
}

但是,您以 application/json 格式发送有效负载。

第二,在发送表单数据时,请不要忘记添加 csrf令牌

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

<script>
    function deleteSupprimerEntite(myData){
        var url = "Index?handler=SupprimerEntite";
        return new Promise(function (resolve, reject) {
            let ajaxConfig = {
                type: "DELETE",
                url: url,
                data: myData ,
                success: function (data) { resolve(data); },
                error: function (data) { reject(data); }
            };
            $.ajax(ajaxConfig);
        })
    }
    document.querySelector("#testbtn").addEventListener("click",function(e){
        var myData ={
            idEntite:1,
            infoCmpl:"abc",
            __RequestVerificationToken: "@(Xsrf.GetAndStoreTokens(HttpContext).RequestToken)",
        };
        deleteSupprimerEntite(myData);
    });
</script>

工作演示:

enter image description here


最后,如果要以 json格式发送,可以将服务器端的Handler更改为:

public class MyModel {
    public int idEntite {get;set;}
    public string infoCmpl{get;set;}
}

public IActionResult OnDeleteSupprimerEntite([FromBody]MyModel xmodel)
{
    return new JsonResult(xmodel);
}

并且js代码应为:

function deleteSupprimerEntiteInJson(myData){
    var url = "Index?handler=SupprimerEntite";
    return new Promise(function (resolve, reject) {
        let ajaxConfig = {
            type: "DELETE",
            url: url,
            data: JSON.stringify(myData) ,
            contentType:"application/json",
            headers:{
                "RequestVerificationToken": "@(Xsrf.GetAndStoreTokens(HttpContext).RequestToken)",
            },
            success: function (data) { resolve(data); },
            error: function (data) { reject(data); }
        };
        $.ajax(ajaxConfig);
    })
}

document.querySelector("#testbtn").addEventListener("click",function(e){
    var myData ={
        idEntite:1,
        infoCmpl:"abc",
    };
    deleteSupprimerEntiteInJson(myData);
});