Как передать сложный класс в качестве аргумента в httpget - PullRequest
5 голосов
/ 28 июня 2019

Я хотел бы иметь возможность обрабатывать сложный тип в качестве аргумента моего метода HttpGet.

Метод pickNFirstElements работает, когда метод api не принимает никаких параметров, но не когда я пытаюсь передать объект.

У меня есть идея, что мне нужно сообщить моему ajax-запросу, что данные представляют собой один объект, но я не знаю, как это сделать, так как я думал, что это точка тега BindProperties в классе TodoItem.

[HttpGet]
        [Route("search")]
        public async Task<ActionResult<TodoItem>> GetMatchingTodoItem([FromQuery]TodoItem todo)
        {
            // var name = todo.Name;
            // var completed = todo.IsComplete;
            return await _context.TodoItems.FirstAsync();
        }
function pickNFirstElements() {
    const item = {
        Name: "dope",
        IsComplete: false,
        Id: 2
    }
    $.ajax({
        type: "GET",
        url: uri+"/search",
        data: { name: item.Name, isComplete: item.IsComplete, Id: Item.Id },
        cache: false,
        success: function (return1) {
            alert(return1.name);
        }
    })
};
namespace TodoApi.Models
{
    [Microsoft.AspNetCore.Mvc.BindProperties(SupportsGet =true)]
    public class TodoItem
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }
    }
}

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Ваш код на самом деле работает (почти) нормально. У вас есть только опечатка в этой строке:

data: { name: item.Name, isComplete: item.IsComplete, Id: Item.Id },

должно быть в нижнем регистре 'item' вместо 'Item':

data: { name: item.Name, isComplete: item.IsComplete, Id: item.Id },

Проверьте вашу консоль в браузере, вы увидите, что она не может найти объект 'Item'.

1 голос
/ 28 июня 2019

HTTP Get предназначен для отсутствия состояния и неизменности.Вы не можете передать что-либо в теле запроса, используя HTTP Get.

Таким образом, вы можете либо отправить параметры запроса / маршрута.

Я предлагаю реорганизовать ваш код по следующему адресу:

Javascript:

function pickNFirstElements() {
    const item = {
        Name: "dope",
        IsComplete: false,
        Id: 2
    };
    const queryParams = new URLSearchParams(item).toString();

    $.ajax({
        type: "GET",
        url: `${uri}/search?${queryParams}`,
        cache: false,
        success: function (return1) {
            alert(return1.name);
        }
    })
};

C #:

[HttpGet("search")]
public async Task<ActionResult<TodoItem>> GetMatchingTodoItem(string name, bool isComplete, int Id)
{
    return await _context.TodoItems.FirstAsync();
}
...