روش دیگر نوشتن Model binderهای سفارشی در ASP.NET Core 7x با معرفی IParseable
نویسنده: وحید نصیری
تاریخ: ۱۴۰۱/۱۱/۰۶ ۱۳:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries =
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy",
"Hot", "Sweltering", "Scorching",
};
// /WeatherForecast/GetForecast2?from=1&to=3
[HttpGet("[action]")]
public IEnumerable<WeatherForecast> GetForecast2(Duration days)
{
return Enumerable.Range(days.From, days.To)
.Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)],
})
.ToArray();
}
} public class Duration
{
public int From { get; set; }
public int To { get; set; }
}
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
} // /WeatherForecast/GetForecast3/1-3
[HttpGet("[action]/{days}")]
public IEnumerable<WeatherForecast> GetForecast3(Days days)
{
return Enumerable.Range(days.From, days.To)
.Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)],
})
.ToArray();
} using System.Diagnostics.CodeAnalysis;
using System.Globalization;
namespace NET7Mvc.Models;
public class Days : IParsable<Days>
{
public Days(int from, int to)
{
From = from;
To = to;
}
public int From { get; }
public int To { get; }
public static bool TryParse([NotNullWhen(true)] string? value,
IFormatProvider? provider,
[MaybeNullWhen(false)] out Days result)
{
var items = value?.Split('-', StringSplitOptions.RemoveEmptyEntries);
if (items is { Length: 2 })
{
if (int.TryParse(items[0], NumberStyles.None, provider, out var from)
&& int.TryParse(items[1], NumberStyles.None, provider, out var to))
{
result = new Days(from, to);
return true;
}
}
result = default;
return false;
}
public static Days Parse(string value, IFormatProvider? provider)
{
if (!TryParse(value, provider, out var result))
{
throw new ArgumentException("Could not parse the given value.", nameof(value));
}
return result;
}
}