Internal Server Error - jQuery ajax post

0

Mam następujący kod w skrypcie:

<script>
    function deleteUser(userId) {     
        $.ajax({
            url: '@Url.Action("DeleteUser")',
            type: "POST",
            dataType: "json",
            data: JSON.stringify({ userId: userId }),
            contentType: "application/json; charset=utf-8",
            success: function () {
                console.log("Sukces");
            },
            error: function (jqXhr) {
                console.log(jqXhr.status);
            }
        });
       getUsersList();
    }

    function appendResultToTable(usersList) {
        $("#tableResult tbody").html('');

        for (let user in usersList) {
            const rowId = user;
            $("#tableResult").find('tbody')
                .append($('<tr>')
                    .attr('id', 'rowTable' + rowId)
                .append($('<td>')
                    .append($('<p>')
                        .append(usersList[user].Email)))
                .append($('<td>')
                    .append($('<button>')
                        .addClass('btn btn-danger')
                        .click(deleteUser(usersList[user].Id))
                        .html('Usuń')))
                );
        }
    }

    function getUsersList() {
        $.ajax({
            url: '@Url.Action("GetUsersList")',
            type: "GET",
            dataType: "json",
            success: function (usersList) {
                appendResultToTable(usersList);
                console.log("Pobrano uzytkownikow");
            },
            error: function (jqXhr) {
                console.log(jqXhr.status);
            }
        });
    }

    $(document).ready(function () {
        console.log("Wszedlem do document on ready");
        getUsersList();
    });
</script>

Użytkowników pobiera dobrze, jednak przy próbie wywołania metody DeleteUser pokazuje się błąd w konsoli Internal Server Error. Jakieś wskazówki?

0

Przerobiłem trochę kod, ale nadal jest to samo:

<script>
    function deleteUser(userId) {     
        $.ajax({
            url: '@Url.Action("DeleteUser")',
            type: "POST",
            dataType: "json",
            data: JSON.stringify({ userId: userId }),
            contentType: "application/json; charset=utf-8",
            success: function () {
                console.log("Sukces zz");
            },
            error: function (jqXhr) {
                console.log(jqXhr.status);
                console.log("Brak sukcesu");
            }
        });
       getUsersList();
    }

    function appendResultToTable(usersList) {
        $("#tableResult tbody").html('');

        for (let user in usersList) {
            const rowId = user;
            $("#tableResult").find('tbody')
                .append($('<tr>')
                    .attr('id', 'rowTable' + rowId)
                .append($('<td>')
                    .append($('<p>')
                        .append(usersList[user].Email)))
                .append($('<td>')
                    .append($('<button>')
                        .addClass('btn btn-danger')
                        .click(e => deleteUser(usersList[user].Id))
                        .html('Usuń')))
                );
        }
    }

    function getUsersList() {
        $.ajax({
            url: '@Url.Action("GetUsersList")',
            type: "GET",
            dataType: "json",
            success: function (usersList) {
                appendResultToTable(usersList);
                console.log("Pobrano uzytkownikow");
            },
            error: function (jqXhr) {
                console.log(jqXhr.status);
            }
        });
    }

    $(document).ready(function () {
        console.log("Wszedlem do document on ready");
        getUsersList();
    });
</script>
0

Dodaje jeszcze metodę z kontrolera:

        [HttpPost]
        public async void DeleteUser(string userId)
        {
            var user = await UserManager.FindByIdAsync(userId);
            var result = await UserManager.DeleteAsync(user);
        }
0

Jeśli funkcja ma usuwać to raczej nie będzie to type: "POST"

0

Ale id usera muszę przekazać, a za pomocą get chyba nie przekazuje się danych.

Nawet jak metodę ustawie jako get jest ten sam błąd.

0

Może DELETE?

0

Próbowałem już getem, postem, deletem i ciągle jest ten sam błąd 500. Czym on może być spowodowany?

0

Zbyt mało informacji o błędzie aby stwierdzić co jest nie tak.

await UserManager.DeleteAsync(user); - nie znam Twojego kodu ale tutaj może być userId zamiast user

0

Aktualnie w przypadku delete występuje 404, czyli jakby nie znajdowało metody. W metodzie kontrolera dałem HttpDelete oraz w metodzie z ajaxem ustawiłem type jako DELETE.

Jakich informacji jeszcze potrzebujesz? W konsoli nic nie wyskakuje oprócz tego błędu.

Neqero napisał(a):

Zbyt mało informacji o błędzie aby stwierdzić co jest nie tak.

await UserManager.DeleteAsync(user); - nie znam Twojego kodu ale tutaj może być userId zamiast user

Tam ma być user, bo ta metoda usuwa usera, a nie znajduje usera po id.

0

Na pewno wysyłasz żądanie pod dobry adres?
Sprawdź w konsoli deweloperskiej.

0
Świetny Samiec napisał(a):
Neqero napisał(a):

Zbyt mało informacji o błędzie aby stwierdzić co jest nie tak.

await UserManager.DeleteAsync(user); - nie znam Twojego kodu ale tutaj może być userId zamiast user

Tam ma być user, bo ta metoda usuwa usera, a nie znajduje usera po id.

Czyli poźniej w samej funkcji usuwania przypisaujesz calego usera do parametru userId ? To nie ma sensu trochę. Sprawdź pod jaki url wykonuje się request.

0
Patryk27 napisał(a):

Na pewno wysyłasz żądanie pod dobry adres?
Sprawdź w konsoli deweloperskiej.

Tak, w konsoli pojawia się błąd dla tego adresu: http://localhost:20114/Manage/DeleteUser

A przecież metoda GetUsersList jest w tym samym kontrolerze i ona działa poprawnie.

Neqero napisał(a):
Świetny Samiec napisał(a):
Neqero napisał(a):

Zbyt mało informacji o błędzie aby stwierdzić co jest nie tak.

await UserManager.DeleteAsync(user); - nie znam Twojego kodu ale tutaj może być userId zamiast user

Tam ma być user, bo ta metoda usuwa usera, a nie znajduje usera po id.

Czyli poźniej w samej funkcji usuwania przypisaujesz calego usera do parametru userId ? To nie ma sensu trochę. Sprawdź pod jaki url wykonuje się request.

Najpierw znajduje usera po id, a następnie go usuwam:

[HttpDelete]
        public async void DeleteUser(string userId)
        {
            var user = await UserManager.FindByIdAsync(userId);
            var result = await UserManager.DeleteAsync(user);
        }
0

Jak wygląda obsługa akcji delete po stronie serwera u Ciebie? Jaki kod za to odpowiada?

0
Neqero napisał(a):

Jak wygląda obsługa akcji delete po stronie serwera u Ciebie? Jaki kod za to odpowiada?

Chodzi Ci o routing? Mam ustawiony domyślny, czyli nazwa_kontrolera/metoda_kontrolera.

0

Wykonując konkretną akcje na pewnym urlu musisz mieć ja obsłużoną po stronie serwera. Nie wiem jakiego frameworka używasz ale wygląda na to że nie masz obsługiwanego delete lub nie budujesz poprawnego urla. Robiąc delete powinieneś zrobić go po id.

Poczytaj sobie https://restfulapi.net/http-methods/

0
Neqero napisał(a):

Wykonując konkretną akcje na pewnym urlu musisz mieć ja obsłużoną po stronie serwera. Nie wiem jakiego frameworka używasz ale wygląda na to że nie masz obsługiwanego delete lub nie budujesz poprawnego urla. Robiąc delete powinieneś zrobić go po id.

Poczytaj sobie https://restfulapi.net/http-methods/

Czyli mam dodać odpowiedni routing? Już taki mam dodany nawet jeśli dodatkowo wysyłam parametr do metody. W przypadku, gdy metoda jest get lub post pojawia się błąd o kodzie 500, natomiast w przypadku delete kod błędu to 404.

0

404 bo resource nie istnieję, więc masz źle obsłużona akcje delete. Zbuduj odpowiedi url z id usera którego chcesz usunac a po stronie serwera obsłuż ta akcje. Id do urla daj.

0

Gdzie mam to zrobić? Bo nie bardzo wiem co mam zrobić.

0

Na początek to radzę poczytać jak działa http delete. Znajdź jakieś przykłady a później sam wpadniesz na pomysł.

Jeśli zrobiłeś get by id to z delete jest bardzo podobnie.

0

Na get i post działa tylko jeżeli metoda coś zwraca. Jeśli metoda w kontrolerze jest void to występuje ten błąd 500

Neqero napisał(a):

Na początek to radzę poczytać jak działa http delete. Znajdź jakieś przykłady a później sam wpadniesz na pomysł.

Jeśli zrobiłeś get by id to z delete jest bardzo podobnie.

W tutorialach jest pokazane aby nadać andotację nad metodą HttpDelete, do tego ustawić routing. Ja tak mam ustawione.

Do tego na przemiennie raz zwracany jest kod 200, raz 500. Czasami operacja się wykonuje, a czasami nie.

Zmodyfikowałem kod i wygląda on teraz tak:


        [HttpGet]
        public async Task<JsonResult> DeleteUser(string userId)
        {
            var user = await UserManager.FindByIdAsync(userId);
            var result = await UserManager.DeleteAsync(user);
            return Json(null, JsonRequestBehavior.AllowGet);
        }
    }
}
function deleteUser(userId) {
        console.log("User Id: " + userId);
        $.ajax({
            url: '@Url.Action("DeleteUser")',
            type: "GET",
            dataType: "json",
            data: { userId: userId },
            contentType: "application/json; charset=utf-8",
            success: function () {
                console.log("Sukces");
            },
            error: function (jqXhr) {
                getUsersList();
                console.log(jqXhr.status);
                console.log("Brak sukcesu");
            }
        });
       
    }

W tej chwili nie zwraca 500. Dodałem typ zwracany jako Json w metodzie w kontrolerze i zwracam null. Bez tego będzie błąd 500. W tej chwili operacja się wykonuje poprawnie. Tyle, że obecnie aplikacji wchodzi mi do metody error, ale zwraca status 200. Jakieś porady czym to może być spowodowane?

Obecnie wchodzi mi do metody error z powodu tego, że zwracam nullowalny obiekt jsonowy. Jednak nie wiem jak to racjonalnie zaimplementować ze względu na to, że coś muszę zwracać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1