[英]How to pass multiple parameters to Get Method and Route them in .NET Core Web API?
我在.NET Core中創建了一個(寧靜的)Web API,並且遇到了一些問題。
我似乎無法找到如何傳遞多個訂閱ID ... 我需要能夠顯示多個訂閱的多個期間(發票)。
我目前的路線是[路線(“租戶/ {tenantId:long} / subscriptions / {subscriptionId:long} / invoices / {invoiceId:long} / categories”)]
從這個角度來看,我似乎無法傳遞更多的訂閱ID。 我發現但未完全理解的一些術語是:
我的課程:
public class Subscription
{
public string Name { get; set; }
public long TenantId { get; set; }
public string Guid { get; set; }
}
public class Invoice
{
public long SubscriptionId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public long PortalId { get; set; }
}
我的控制器有路由[Route("tenants/{tenantId:long}/subscriptions")]
和[Route("tenants/{tenantId:long}/subscriptions/{subscriptionId:long}/invoices")]
[HttpGet]
public IEnumerable<SubscriptionViewModel> Find(long tenantId)
{
var subscriptionList = _subscriptionManager.Find(tenantId);
...
return subscriptionViewModels;
}
[HttpGet]
public IEnumerable<InvoiceViewModel> Find(long subscriptionId)
{
var invoiceList = _invoiceManager.Find(subscriptionId);
...
return invoiceViewModels;
}
我正在尋找/ api /發票之類的路線?subscriptionId = x,y,z
我理解(?)我需要[FromQuery],但我似乎無法弄清楚如何,特別是如果我的參數(subscriptionId)保持不變。
對於您提到的要求:
我正在尋找/ api /發票之類的路線?subscriptionId = x,y,z
你可以做幾件事:
&
傳遞subscriptionIds,並將action方法的輸入參數更改為接受subscriptionIds數組的路由示例: /api/invoices/find?subscriptionId=x&subscriptionId=y&subscriptionId=z
action方法參數接受subscriptionIds數組的示例:
public IEnumerable<InvoiceViewModel> Find([FromQuery]long[] subscriptionId)
/api/invoices/find?subscriptionIds=x,y,z
動作方法示例:
public IEnumerable<InvoiceViewModel> Find([FromQuery]string subscriptionIds)
{
var ids = subscriptionIds.Split(',').Select(int.Parse).ToArray();
// do the logic on multiple subscriptionIds
}
除此之外,您還可以創建自定義模型綁定器以及其他答案中的建議。
希望這可以幫助。
您可以創建一個特定的請求視圖模型,該模型接受發票ID的集合:
public class InvoiceRequestModel
{
IEnumerable<long> InvoiceIDS { get; set; }
}
並將其用於您的操作方法:
[Route("tenants/{tenantId:long}/subscriptions/{subscriptionId:long}/invoices")]
[HttpGet]
public IEnumerable<InvoiceViewModel> Get(InvoiceRequestModel requestModel)
{
}
如果要使用查詢參數,請使用[FromQuery]
屬性標記action參數:
[Route("tenants/{tenantId:long}/subscriptions/{subscriptionId:long}/invoices")]
[HttpGet]
public IEnumerable<InvoiceViewModel> Get([FromQuery]IEnumerable<long> invoiceIDs)
{
}
在創建請求時,使用查詢字符串中的相同鍵傳遞每個值:
invoiceIDs=1&invoiceIDs=2&invoiceIDs=3
最后,它看起來像這樣:
tenants/{tenantId}/subscriptions/{subscriptionId}/invoices?invoiceIDs=1&invoiceIDs=2&invoiceIDs=3
有很多方法可以完成這項任務(我現在可以想到兩到三個)。
1)而不是long subscriptionid將字符串作為輸入並在繼續進行之前對其進行驗證。
[HttpGet]
public IEnumerable<InvoiceViewModel> Find(string subscriptionIds)
{
var list = validateInput(subscriptionIds);
var invoiceList = _invoiceManager.FindList(list);
...
return invoiceViewModels;
}
public IList<long> validateInput(string subscriptionIds)
{
var list = subscriptionIds.Split(",");
... // Code to convert each element in long and throw if it is not long
return longlist;
}
2)創建自定義模型綁定器。
這里提到的步驟:
=> [FromUri]屬性可用於從查詢字符串參數綁定復雜類型,但我不知道我將如何使用它。
如果你問我,我會選擇接近-1(不增加復雜性)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.