Обработчик OnDelete всегда вызывает неверный запрос - PullRequest
1 голос
/ 27 июня 2019

Пытаясь быть более совместимым с HTTP-глаголами, я пытаюсь вызвать обработчик удаления на странице Razor через AJAX;

Вот мой код 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 Ответ

2 голосов
/ 27 июня 2019

Краткий ответ : 400 bad request указывает, что запрос не удовлетворяет требованиям на стороне сервера.


Во-первых, ваш сервер ожидает форму by;

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 , вы можете изменить обработчик на стороне сервера на:

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);
});
...