簡體   English   中英

如何將多個參數傳遞給Get方法並在.NET Core Web API中對它們進行路由?

[英]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。 我發現但未完全理解的一些術語是:

  • 模型綁定
  • [FromQuery]

我的課程:

    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;
    }
  • 請注意我正在使用Mapper來獲取我的數據(這就是我使用ViewModels的原因)。
  • 當前編寫的代碼用於特定訂閱。

我正在尋找/ api /發票之類的路線?subscriptionId = x,y,z

我理解(?)我需要[FromQuery],但我似乎無法弄清楚如何,特別是如果我的參數(subscriptionId)保持不變。

對於您提到的要求:

我正在尋找/ api /發票之類的路線?subscriptionId = x,y,z

你可以做幾件事:

  1. 在URL的查詢字符串中依次用&傳遞subscriptionIds,並將action方法的輸入參數更改為接受subscriptionIds數組的路由示例:
/api/invoices/find?subscriptionId=x&subscriptionId=y&subscriptionId=z

action方法參數接受subscriptionIds數組的示例:

public IEnumerable<InvoiceViewModel> Find([FromQuery]long[] subscriptionId)
  1. 在URL中將逗號分隔的字符串作為查詢字符串傳遞,並在操作方法中寫入一段邏輯,以基於逗號分割字符串,以獲取routeIds的一個例子:route ::
/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)創建自定義模型綁定器。

這里提到的步驟:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

=> [FromUri]屬性可用於從查詢字符串參數綁定復雜類型,但我不知道我將如何使用它。

如果你問我,我會選擇接近-1(不增加復雜性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM