ASP.Net Core 3 и простой POST контроллер - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь отправить сообщение на сервер ASP.NET core 3. Однако мой number всегда 0. Есть ли в ASP.Net Core 3 хитрость, которую я не понимаю?

Параметр [FromBody] не решает проблему. И классы как параметр не помогают. Значения не меняются.

[HttpPost]
[Route("/api/add")]
public ActionResult<Dictionary<string, object>> Add(int number)
{

    // number is always 0 :(  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    number += 1;

    var d = new Dictionary<string, object>
    {
        ["message"] = "Hello",
        ["number"] = number 
    };

    return Ok(d);
}
let input = { number: 5825 }

$.ajax(
    {
        url: `/api/add`,
        type: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(input),
        accepts: "application/json",
        complete: function (output) {
            // completed
        }
    }
);

Мои сервисы

services.AddSession();
services.AddHttpContextAccessor();
services.AddControllersWithViews();

И я использую

app.UseSession();
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute("default", "{controller=Default}/{action=Index}/{id?}"); });

Ответы [ 3 ]

4 голосов
/ 17 октября 2019

На основе показанного клиентского кода этот клиент публикует комплексный тип для привязки к простому типу на сервере.

Создание модели

public class Data {
    public int number { get; set; }
}

Привязка модели к действию

[HttpPost]
[Route("/api/add")]
public IActionResult Add([FromBody]Data model) {

    if(ModelState.IsValid) {

        var number = model.number;
        number += 1;

        var d = new {
            message = "Hello",
            number = number 
        };

        return Ok(d);
    }

    return BadRequest(ModelState);
}
1 голос
/ 18 октября 2019

В вашем javascript вместо публикации ввода объекта попробуйте разместить числовую переменную напрямую:

let number=5825;

$.ajax(
    {
        url: `/api/add`,
        type: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: number,
        accepts: "application/json",
        complete: function (output) {
            // completed
        }
    }
);

В вашем контроллере используйте аннотацию [FromBody]:

[HttpPost]
[Route("/api/add")]
public ActionResult<Dictionary<string, object>> Add([FromBody]int number)
{

    // number is always 0 :(  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    number += 1;

    var d = new Dictionary<string, object>
    {
        ["message"] = "Hello",
        ["number"] = number 
    };

    return Ok(d);
}

Согласенпроблема в том, что вы пытаетесь отправить сложный тип, в то время как ваше действие принимает только простой тип int. Дайте мне знать, если у вас все еще есть проблемы.

0 голосов
/ 18 октября 2019

Вы можете воспользоваться решением @Nkosi, чтобы добавить свойство в модель. Или, если вы не хотите создавать модель, просто добавьте число в URL-запрос, как показано ниже:

let number = 5825;
    $.ajax(
        {
            url: '/api/add?number=' + number,
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            accepts: "application/json",
            complete: function (output) {
                // completed
            }
        }
    );


[HttpPost]
[Route("/api/add")]

public ActionResult<Dictionary<string, object>> Add(int number)
{
  //...
}
...