如何将复杂的 class 作为参数传递给 httpget
How to pass complex class as argument to httpget
我希望能够将复杂类型作为我的 HttpGet 方法的参数进行处理。
pickNFirstElements 方法在 api 方法不接受任何参数时有效,但在我尝试传递对象时无效。
我有一个想法,我需要通知我的 ajax 查询数据是单个对象,但我不知道这是如何完成的,因为我认为那是 BindProperties 标记的重点在 TodoItem class.
[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; }
}
}
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();
}
您的代码实际上(几乎)可以正常工作。您只有这一行有错别字:
data: { name: item.Name, isComplete: item.IsComplete, Id: Item.Id },
应该是小写的 'item' 而不是 'Item':
data: { name: item.Name, isComplete: item.IsComplete, Id: item.Id },
在浏览器中检查您的控制台,您会发现它找不到对象 'Item'。
我希望能够将复杂类型作为我的 HttpGet 方法的参数进行处理。
pickNFirstElements 方法在 api 方法不接受任何参数时有效,但在我尝试传递对象时无效。
我有一个想法,我需要通知我的 ajax 查询数据是单个对象,但我不知道这是如何完成的,因为我认为那是 BindProperties 标记的重点在 TodoItem class.
[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; }
}
}
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();
}
您的代码实际上(几乎)可以正常工作。您只有这一行有错别字:
data: { name: item.Name, isComplete: item.IsComplete, Id: Item.Id },
应该是小写的 'item' 而不是 'Item':
data: { name: item.Name, isComplete: item.IsComplete, Id: item.Id },
在浏览器中检查您的控制台,您会发现它找不到对象 'Item'。