XHR POST: API Controller работает, Razor Page терпит неудачу - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть стандартное веб-приложение ASP.NET Core, созданное из шаблона Visual Studio.У меня есть страница бритвы, которая выдает запрос XHR POST с полезной нагрузкой после события изменения.

Если я сделаю URL-адрес запроса контроллером API в приложении (то есть в папке Controllers), запросуспешно.

Если я выполняю один и тот же запрос с той же полезной нагрузкой для метода страницы бритвы (в папке Pages), он завершается с http 400.

Оба метода имеют одинаковую подпись.

Кто-нибудь может описать, почему поведение отличается?

Я бы хотел использовать средство на бритвенных страницах для POST для метода-обработчика из XHR.

UserController.cs

namespace Athena.Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UserController : ControllerBase
    {
        public void Post([FromBody]object postedObj)
        {
            ...
        }
    }
}

Usr.cshtml.cs

namespace Athena.Web.Pages.Users
{
    public class UsrModel : PageModel
    {
        public void OnPostActionHere([FromBody]object postedObj)
        {
            ...        
        }

        public void OnPost([FromBody]object postedObj)
        {
            ...
        }
    }
}

Usr.cshtml

@page "{handler?}"
@model Athena.Web.Pages.Users.UsrModel
@{
    ViewData["Title"] = "Edit";
}

<h1>User</h1>

Я не могу опубликовать вызов XHR, поскольку он поступает от стороннего Syncfusionуправление, но страница вызова в основном:

Index.cshtml

<ejs-grid id="grid">
    <e-data-manager updateUrl="/api/User" insertUrl="/Home/Usr" adaptor="UrlAdaptor">
...
</ejs-grid>

1 Ответ

0 голосов
/ 21 сентября 2019

Запросы XHR Post неизменно терпят неудачу, когда нацелены на метод-обработчик Razor Page с ошибочным запросом 400, поскольку вы не включили токен подтверждения запроса в запрос, либо в виде поля формы, либо в качестве заголовка.

https://www.mikesdotnetting.com/article/336/ajax-posts-in-razor-pages-and-http-400-errors

самый простой способ создать токен - это включить элемент <form> с методом, установленным в post, и затем вы можете включить токен в запрос:

$.ajax({
    type: "POST",
    url: "/",
    data: { foo: "bar" },
    headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
    success: function (response) {
...