在 C# Asp.netcore 專案中作業,我試圖從 GET 請求中的 IQueryCollection 讀取陣列。IQueryCollection 在 Request.Query 中。
我需要在沒有模型的情況下閱讀查詢。當前端 json 到達后端時,它不再是 JSON,這很好,我只需要讀取前端通過的任何內容。在這個例子中它是一個 int 陣列,但它可以是任何東西。
模型不能很好地擴展查詢。要在 get 上回傳模型,它們的作業非常出色,但是對于可以根據需要復雜或簡單的查詢,我無法提交模型。如果我可以將查詢提取到匿名物件,那將非常有用。
Json從前端傳過來:
var params = {
items: [1, 4, 5],
startDate: new Date(),
endDate: new Date()
}
C# Request.QueryString
{?items%5B%5D=1&items%5B%5D=4&items%5B%5D=5&startDate=Fri%20Oct%2015%202021%2022%3A30%3A57%20GMT%2B1000%20(Australian%20Eastern%20Standard%20Time)&endDate=Fri%20Oct%2015%202021%2022%3A30%3A57%20GMT%2B1000%20(Australian%20Eastern%20Standard%20Time)}
我試過了:
// Gives me a null
var value = HttpUtility.ParseQueryString(Request.QueryString.Value).Get("items");
// Gives me an empty object {}
var value = Request.Query["items"];
希望這是足夠的資訊。
uj5u.com熱心網友回復:
陣列的查詢字串格式未定義。一些 web 框架使用?foo[]=1&foo[]=2,其他人使用?foo=1&foo=2,還有其他人?foo[0]=1&foo[1]=2。
您必須在客戶端序列化它時使用相同的決議服務器端。這適用于您的[]語法:
var queryString = "?items[]=1&items[]=4&items[]=5&date=2021-10-15";
var parsed = HttpUtility.ParseQueryString(queryString);
foreach (var key in parsed.AllKeys)
{
if (key.EndsWith("[]"))
{
var values = string.Join(", ", parsed.GetValues(key));
Console.WriteLine($"{key}: array: {values}.");
}
else
{
Console.WriteLine($"{key}: scalar: {parsed[key]}.");
}
}
輸出:
items[]: array: 1, 4, 5.
date: scalar: 2021-10-15.
但與其自己決議查詢字串,不如讓框架來做。你說你沒有發現模型可擴展;我發現手工撰寫的代碼不能很好地擴展。如果您在 JS 端修復日期序列化程式,這樣的模型就可以正常作業:
public class RequestModel
{
public int[] Items { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/321738.html
標籤:C# json asp.net-mvc asp.net核心 动态的
