如何将复杂类作为参数传递给 httpget

问题描述 投票:0回答:3

我希望能够将复杂类型作为我的 HttpGet 方法的参数进行处理。

pickNFirstElements 方法在 api 方法不接受任何参数时有效,但在我尝试传递对象时无效。

我有一个想法,我需要通知我的 ajax 查询数据是单个对象,但我不知道这是如何完成的,因为我认为这是 TodoItem 类中 BindProperties 标记的要点。

[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; }
    }
}
c# ajax rest asp.net-core http-get
3个回答
3
投票

您的代码实际上(几乎)可以正常工作。你只有这一行错别字:

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

应该是小写的'item'而不是'Item':

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

在浏览器中检查您的控制台,您会发现它找不到对象“Item”。


1
投票

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();
}

0
投票

.Net Core 给你 BindAttribute..

[HttpGet("route")]
public async Task<ActionResult<TodoItem>> SomeMethod([Bind(nameof(TodoItem))] TodoItem todoItem)
{
    // Your code..
}
© www.soinside.com 2019 - 2024. All rights reserved.