C# 如何将复杂类作为参数传递给httpget
我希望能够将复杂类型作为HttpGet方法的参数来处理 当api方法不接受任何参数时,pickNFirstElements方法有效,但当我尝试传递对象时无效 我有一个想法,我需要通知我的ajax查询数据是单个对象,但我不知道如何做到这一点,因为我认为这是TodoItem类中BindProperties标记的要点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]
[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();
}