Как передать переменную json в контроллере MVC в C# .net core 3.1

#c# #json #.net #asp.net-mvc #asp.net-core

Вопрос:

Я прошел несколько обучающих программ в сети, но все равно получил тот же результат. Документация Microsofts настолько глубока, учитывая, что все, что я хочу,-это, по сути, отправить одну переменную контроллеру.

Мой код на стороне клиента выглядит следующим образом:

 var obj = { send: 'test' };

    $.ajax({
        url: '/Countries/GetVotes',
        type: 'POST',
        contentType: "application/json",
        data: JSON.stringify(obj),
        success: function (data) {
            if (data === null) {
                // TODO
            } else {
                console.log(data);
            }
        },
        error: function (error) {
            console.log(error);
        }
    }); 
 

Тогда контроллер будет выглядеть так:

 [HttpPost]
    public async Task<JsonResult> GetVotes(string send)
    {
        try
        {
            var votes = ctx.Candidates.Where(x => x.Country == send)
                .OrderByDescending(x => x.Votes)
                .ToList();
            
            return Json(votes);

        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }

        return Json("foo");
    }
 

Все стандартные и используемые для работы в .NET framework 4.7.2, любой, кто занимался каким-либо MVC, был бы хорошо знаком с этим подходом.

Я принял решение попробовать использовать .net core 3.1. Попадаю во все правильные точки останова, проблема в том, что строка под названием «отправить» отправляется на мой контроллер как нулевая.

Кто — нибудь знает самый простой способ заставить это работать?

Комментарии:

1. У вас есть какие-нибудь ошибки?

2. ПРИВЕТ, нет, не вижу, чтобы в переменной контроллеров появлялся только нуль

Ответ №1:

То, что вы передаете, является объектом JSON

 { send: "test" }
 

То, что вы ожидаете в теле запроса в контроллере, — это просто строка. Вы можете попробовать создать объект запроса, представляющий структуру данных, которую вы ожидаете:

 public class Request {
    public string send { get; set; }
}
 

Затем вы можете обновить свой метод контроллера до

 public async Task<JsonResult> GetVotes([FromBody]Request request) 
 

И дальнейший доступ к свойству отправки через request.send.

Комментарии:

1. Идеальная и очень быстрая реакция, так просто. Почему каждый учебник так сложен, это намного проще понять, еще раз спасибо 🙂

Ответ №2:

вам не нужно вводить строку, когда вы уже отправляете строку. И удалите тип контента тоже. По умолчанию все было бы в порядке.

Так что попробуйте это

   $.ajax({
        url: '/Countries/GetVotes',
        type: 'POST',
     
        data: obj,
        success: function (data) {
            if (data === null) {
                // TODO
            } else {
                console.log(data);
            }
        },
        error: function (error) {
            console.log(error);
        }
    });