Связыватель модели не находит данные поста - PullRequest
0 голосов
/ 14 октября 2018

У меня есть простой пост 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 равно нулю.Тем не менее, base64, который заполняется из переменных формы, имеет значение.

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

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

То, что отправлено $.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();
}
0 голосов
/ 15 октября 2018

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

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