Asp .Net Core 2.2 Razor Pages Ajax Call Post не работает - PullRequest
0 голосов
/ 27 мая 2019

Я сделал так много AJAX на бритвенных страницах, но я не могу понять, почему это не работает.Он продолжает выдавать ошибку 400 на инструментах разработчика.Он не достигает обработчика страницы, несмотря ни на что.

<script>
     $.ajax({
                    url: "/Account/Users/Index?handler=Delete",
                    type: "POST",
                    data: {
                        id: id
                    },
                    success: function () {
                        swal("Utilizador Desactivado!", {
                            icon: "success",
                        });
                    },
                    error: function (xhr, ajaxOptions, thrownError) {
                        swal("Falha na ligação ao servidor. Tente novamente mais tarde.");
                    }
                });
</script>

обработчик страницы

  public async Task<IActionResult> OnPostDeleteAsync(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var user = await _context.Users.FindAsync(id);

        if (user != null)
        {
            user.IsActivo = false;
            _context.Users.Attach(user).Property( u => u.IsActivo).IsModified = true;
            await _context.SaveChangesAsync();
        }

        return RedirectToPage("./Index");
    }

Я перепробовал много комбинаций URL, но ни одна из них не работает.Я не вижу, что здесь не так ...

РЕДАКТИРОВАТЬ

Кажется, проблема в том, что маркер защиты от подделки не проверен на странице бритвы.

Я написал Ignore Anti Forger Token на странице модели и все работает правильно

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Как вы уже узнали, это маркер против подделки, который разрушает ваш день. Теперь, если вы находитесь внутри формы, ядро ​​asp.net создаст скрытый ввод с этим токеном для вас. Если вы не работаете с формой на своей странице, вам придется позвонить @Html.AntiForgeryToken(), чтобы добавить маркер для вас. Тем не менее, это не разрешит плохой запрос для вас. Вы должны добавить его в свой вызов ajax:

$.ajax({
    url: "/Account/Users/Index?handler=Delete",
    type: "POST",
    beforeSend: function (xhr) {
        xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    data: {
        id: id
    },
});

Кроме того, добавьте эту строку в файл Startup.cs:

services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
1 голос
/ 27 мая 2019

Я не знаю, какое отображение URL вы используете, но, как обычно, оно состоит из controllerName / actionName /. В вашем случае попробуйте использовать:

url: "/Account/OnPostDeleteAsync"

или

url: "/Users/OnPostDeleteAsync" но если ваш URL правильный, попробуйте использовать атрибут [FromForm]

public async Task<IActionResult> OnPostDeleteAsync([FromForm]int? id)

Надеюсь, это поможет

...