@artshelom

Как передавать данные в контроллер??

Создал контроллер API, в который не получается передать данные:
[Route("api/User")]
        [ApiController]
        public class UserApiController : ControllerBase
        {
            [HttpPost("data")]
            public async Task<JsonResult> data(string dataOld, string dataNew)
            {
                return null;
            }
            [HttpPost("Settings")]
        public async Task<JsonResult> Settings([FromBody] JObject jObject)
        {
            return null;
        }


В метод data передаются пустые данные, а метод Settings возвращает ошибку не выполняя метод.
HTML:
$.post(
        "/api/User/data",
        {
            dataOld: "param1",
            dataNew: "param2"
        },
        function (data) {
            alert(JSON.stringify(data));
        }
    );
    var books = [{
        name: "Чайка",
        price: 200,
    }, {
        name: "Война и мир",
        price: 230,
    }];
    $.ajax({
        url: '/api/User/Settings',
        type: 'POST',
        data: JSON.stringify(books),
        contentType: "application/json;charset=utf-8",
        success: function (data) {
            alert('Данные отправлены');
        }
    });
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
@kttotto
пофиг на чем писать
Думаю, что проблема в
JSON.stringify(books)
т.к. по сути этой строкой Вы отправляете string, а не объект. Несовпадение типа, он его и не видит.
Если хотите в методе объект принять, не нужно его к строке преобразовывать, можно просто
data: books,
Но что-то мне подсказывает, что в Вашем варианте и здесь могут быть проблемы. Зачем Вы принимаете JObject?
Преобразуете его потом, примите его как есть массивом
public async Task<JsonResult> Settings(object[] books)

А еще лучше, типизируйте как положено, ну а затем сделаете что-то вроде JObject.FromObject(books).

PS:
а метод Settings возвращает ошибку не выполняя метод.

В таких случаях хорошо бы и текст ошибки к вопросу прикладывать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
1. Вы вызываете метод Password в первом случае.
2. В параметрах методов контроллеров должна быть модель данных которые передаете, типа
class Book
{
 public string Name {get; set;}
 public int Price {get; set;}
}

 public async Task<IActionResult> Settings([FromBody] Book[] books)
{
return Ok()
}

3. RestApi строится не таким образом, в контроллере должны быть методы которые отвечают за CRUD операции и соответственно выполняются разными типами запросов, GET - выборка данных, POST - добавление данных, PUT - Модификация, DELETE - удаление. И один контроллер отвечает за работу только с одним типом данных, те если у вас UsersController, то работа идет только с типом Users,
4. Возвращайте из контроллера IActionResult, У контроллера есть несколько методов типа Ok, BadRequest, NotFound, NoContent. Соответственно они устанавливают статус ответа (200,404 и т.д.), что вам понадобится для обработки ошибок
5. Вот как пример контроллера RestAPI - https://pastebin.com/PykpEGWP, те если у вас методы контроллера должны отправлять и принимать только тип User и с клиента отправляете только его.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы