如何在路由繫結中使用 IParsable

Newbe36524發表於2022-12-23

IParsable 是 .Net 7 中新增的介面,它可以將字串轉換為對應的實體。在 Controller 的 Route 繫結中可以使用 IParsable 來繫結複雜的實體。

實驗背景

假設有一個需要將 route "report/{month}-{day}" 繫結到 MyDate 物件上的場景。

在 .Net 7 之前,通常是使用兩個引數來接收繫結的 month 和 day,然後在程式碼中例項化 MyDate 物件。例如:

[Route("report/{month}-{day}")]
public ActionResult GetReport(int month, int day)
{
    var myDate = new MyDate { Month = month, Day = day };
    // 使用 myDate
}

使用 IParsable

在 .Net 7 中,可以直接讓 MyDate 實現 IParsable 介面,然後在 route 中繫結 "report/{myDate}"。這樣 MyDate 就能直接從 route 上繫結,省去了手動例項化的步驟。

下面是一個示例程式碼:

public class MyDate : IParsable<MyDate>
{
    public int Month { get; set; }
    public int Day { get; set; }

    public void Parse(string input)
    {
        var parts = input.Split('-');
        Month = int.Parse(parts[0]);
        Day = int.Parse(parts[1]);
    }

    public static MyDate Parse(string s, IFormatProvider? provider)
    {
        var date = new MyDate();
        date.Parse(s);
        return date;
    }

    public static bool TryParse(string? s, IFormatProvider? provider, out MyDate result)
    {
        try
        {
            result = Parse(s, provider);
            return true;
        }
        catch
        {
            result = default;
            return false;
        }
    }
}

[HttpGet("report/{myDate}")]
public ActionResult GetReport(MyDate myDate)
{
    // myDate 已經被正確地繫結
}

參考資料

  • IParsable[1]
  • 5 new MVC features in .NET 7[2]

本文采用 Chat OpenAI 輔助注水澆築而成,如有雷同,完全有可能。

  • 本文作者: newbe36524
  • 本文連結: https://www.newbe.pro/ChatAI/How-to-use-IParsable-in-route-binding/
  • 版權宣告: 本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!

參考資料

[1]

IParsable: https://learn.microsoft.com/en-us/dotnet/api/system.iparsable-1?view=net-7.0&WT.mc_id=DX-MVP-5003606

[2]

5 new MVC features in .NET 7: https://andrewlock.net/5-new-mvc-features-in-dotnet-7/

相關文章