Модель Binder не находит данные для публикации

У меня есть простой пост jquery

function saveImage(base64) {
  $.post("http://localhost:50575/api/images", {base64Data: base64});
}

Это противоречит контроллеру ядра .net

[HttpPost]
public async Task<ActionResult> Post(string base64Data)
{
    var base64 = Request.Form["base64Data"];
    return Ok();
}

Когда данные отправляются, base64Data имеет значение NULL. Однако base64 , который заполняется из переменных формы, имеет значение.

Есть ли причина, почему это не должно работать?

Всего 2 ответа


Что отправлено $.post("http://localhost:50575/api/images", {base64Data: base64}) :

POST /api/images HTTP/1.1
Content-Type: application/x-www-form-urlencoded

base64Data=xxxxxxxx

Поскольку вы отправляете запрос с типом контента application/x-www-form-urlencoded и обрабатываете запрос ApiController , вы должны украсить этот параметр с помощью параметра [FromForm]

public async Task<ActionResult> Post([FromForm] string base64Data)
{
    // ...
}

Или, если вы хотите отправить запрос, закодированный с помощью application/json , вы должны сначала создать DTO для хранения всей загрузочной загрузки:

public class Base64Dto{
    public string Base64Data{get;set;}
}

и одновременно украсить параметр [FromBody] :

public async Task<ActionResult> Post([FromBody] Base64Dto base64Data)
{
    // var base64 = Request.Form["base64Data"];
    return Ok();
}

Другой способ удержания всей полезной нагрузки с помощью Base64Dto - отправить запрос с заголовком Content-Type: application/x-www-form-urlencoded и одновременно использовать [FromForm] :

public async Task<ActionResult> Post([FromForm] Base64Dto base64Data)
{
    // var base64 = Request.Form["base64Data"];
    return Ok();
}

Вы должны использовать атрибут [FromBody] при привязке моделей к запросу POST.

[HttpPost]
public async Task<ActionResult> Post([FromBody]string base64Data)
{
    var base64 = Request.Form["base64Data"];
    return Ok();
}

Есть идеи?

10000