Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将复杂类作为参数传递给httpget_C#_Ajax_Rest_Asp.net Core_Http Get - Fatal编程技术网

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

C# 如何将复杂类作为参数传递给httpget,c#,ajax,rest,asp.net-core,http-get,C#,Ajax,Rest,Asp.net Core,Http Get,我希望能够将复杂类型作为HttpGet方法的参数来处理 当api方法不接受任何参数时,pickNFirstElements方法有效,但当我尝试传递对象时无效 我有一个想法,我需要通知我的ajax查询数据是单个对象,但我不知道如何做到这一点,因为我认为这是TodoItem类中BindProperties标记的要点 [HttpGet] [Route("search")] public async Task<ActionResult<TodoItem>

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

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

我有一个想法,我需要通知我的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();
        }

httpget意味着无状态且不可变。无法使用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(“搜索”)]
公共异步任务GetMatchingTodoItem(字符串名称,bool isComplete,int Id)
{
返回wait_context.TodoItems.FirstAsync();
}

您的代码实际上运行(几乎)正常。这一行中只有一个输入错误:

数据:{name:item.name,isComplete:item.isComplete,Id:item.Id},

应为小写“item”而不是“item”:

数据:{name:item.name,isComplete:item.isComplete,Id:item.Id},


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

传递复杂对象以获取是不可取的
[FromBody]
,而不是
[FromQuery]
那么正确的设计是什么呢?使用简单的参数,然后将它们传递给get中的构造函数?HTTP get意味着是无状态和不可变的,发送复杂对象的设计不好,我们通过查询字符串或路由参数发送它,不要太在意上面的注释。使用
FromQuery
BindPropertiesAttribute
,这应该是可行的。我看到这个解决方案可以工作,但是如果我使用的是可能有其他类作为字段的较大类,该怎么办呢。这样一个类需要很多参数,我认为这是一个糟糕的做法?我让我的初始代码使用Post,因为它接受复杂类型,但Post的目的永远不应该是检索元素,对吗?
您不能使用HTTP Get在请求体中传递某些内容。
好吧,从技术上讲,您可以-。但这样做是没有用的。:)@mabeto5p此解决方案可能很快变得笨拙,但您需要后退一步,重新思考您试图实现的内容。如果希望发送复杂对象并期望响应是幂等的,HTTP POST是可以的。在类型为“GET”的ajax调用中在“data”字段中传递参数实际上会将它们添加到查询字符串中,而不是身体。所以这不是问题所在。
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; }
    }
}
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);
        }
    })
};
[HttpGet("search")]
public async Task<ActionResult<TodoItem>> GetMatchingTodoItem(string name, bool isComplete, int Id)
{
    return await _context.TodoItems.FirstAsync();
}