asp .net 的 DateOnly 输入
DateOnly input for asp .net
我正在使用 ASP.NET Core 6 MVC 创建链接到数据库的应用程序,但我遇到了问题:
我搭建了一个控制器及其视图(创建、编辑...),但是当我尝试创建一个对象以使用 Entity Framework 发送到数据库时,DateOnly
类型的字段不会工作并为我尝试写的所有日期输入这个日期:292269055-12-03(它似乎是最大值?)。
出于兼容性原因,我需要使用 DateOnly
类型,因为数据库有 date
列(我在此处 https://www.npgsql.org/doc/types/datetime.html 找到了此信息)并且如果我尝试使用 datetime
,没用。
这是我的代码:
查看:
<div class="form-group">
<label asp-for="BirthDay" class="control-label"></label>
<input asp-for="BirthDayUI" class="form-control" type="date"/>
<span asp-validation-for="BirthDay" class="text-danger"></span>
</div>
控制器(自动生成):
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,FirstName,BirthDay,Email,MobilePhone,LandLinePhone,PostalCity,PostalCode,PostalAdress,Gender,MedicalCertificate,MedicalCertificateStart,MedicalCertificateEnd,ProfilePicture")] Member member)
{
if (ModelState.IsValid)
{
_context.Add(member);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(member);
}
最后,我尝试 fiddle 的模型:
[Required]
public DateOnly BirthDay { get; set; }
[NotMapped]
public DateTime BirthDayUI
{
get => BirthDay.ToDateTime(new TimeOnly());
set => BirthDay = DateOnly.FromDateTime(value);
}
getter 完美运行,但 setter 不完美,我不知道我必须更改什么。
谢谢你帮助我
我还没有使用 .NET 6 的经验,但我对此进行了一些研究。
https://devblogs.microsoft.com/dotnet/date-time-and-time-zone-enhancements-in-net-6/
我找到了下一行
DateOnly d3 = DateOnly.ParseExact("31 Dec 1980", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format
尝试在您的 setter 上使用它,像这样:
set => BirthDay = DateOnly.ParseExact(value.ToShortDateString(), "dd MMM yyyy", CultureInfo.InvariantCulture);
不要忘记指定格式和文化信息
如果可行,请告诉我!
我终于找到了解决办法:
我创建了我的成员模型的 UI 版本,它使用 DateTime 属性并将我的成员控制器绑定到它上面(而不是成员类型),我使用一个小函数将它转换为我的原始成员类型。我将其命名为 memberviewmodel(但我不确定这个名称是否合适)。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,FirstName,BirthDay,Email,MobilePhone,LandLinePhone,PostalCity,PostalCode,PostalAdress,Gender,MedicalCertificate,MedicalCertificateStart,MedicalCertificateEnd,ProfilePicture")] **MemberViewmodel membervm**)
{
Member member = ModelViewmodelConverter.MemberViewmodelToMember(membervm);
if (ModelState.IsValid)
{
_context.Add(member);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(member);
}
函数:
public static Member MemberViewmodelToMember(MemberViewmodel vm)
{
Member result = new Member()
{
...
BirthDay = DateOnly.FromDateTime(vm.BirthDay),
...
}
return result;
}
我正在使用 ASP.NET Core 6 MVC 创建链接到数据库的应用程序,但我遇到了问题:
我搭建了一个控制器及其视图(创建、编辑...),但是当我尝试创建一个对象以使用 Entity Framework 发送到数据库时,DateOnly
类型的字段不会工作并为我尝试写的所有日期输入这个日期:292269055-12-03(它似乎是最大值?)。
出于兼容性原因,我需要使用 DateOnly
类型,因为数据库有 date
列(我在此处 https://www.npgsql.org/doc/types/datetime.html 找到了此信息)并且如果我尝试使用 datetime
,没用。
这是我的代码:
查看:
<div class="form-group">
<label asp-for="BirthDay" class="control-label"></label>
<input asp-for="BirthDayUI" class="form-control" type="date"/>
<span asp-validation-for="BirthDay" class="text-danger"></span>
</div>
控制器(自动生成):
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,FirstName,BirthDay,Email,MobilePhone,LandLinePhone,PostalCity,PostalCode,PostalAdress,Gender,MedicalCertificate,MedicalCertificateStart,MedicalCertificateEnd,ProfilePicture")] Member member)
{
if (ModelState.IsValid)
{
_context.Add(member);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(member);
}
最后,我尝试 fiddle 的模型:
[Required]
public DateOnly BirthDay { get; set; }
[NotMapped]
public DateTime BirthDayUI
{
get => BirthDay.ToDateTime(new TimeOnly());
set => BirthDay = DateOnly.FromDateTime(value);
}
getter 完美运行,但 setter 不完美,我不知道我必须更改什么。
谢谢你帮助我
我还没有使用 .NET 6 的经验,但我对此进行了一些研究。 https://devblogs.microsoft.com/dotnet/date-time-and-time-zone-enhancements-in-net-6/
我找到了下一行
DateOnly d3 = DateOnly.ParseExact("31 Dec 1980", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format
尝试在您的 setter 上使用它,像这样:
set => BirthDay = DateOnly.ParseExact(value.ToShortDateString(), "dd MMM yyyy", CultureInfo.InvariantCulture);
不要忘记指定格式和文化信息
如果可行,请告诉我!
我终于找到了解决办法: 我创建了我的成员模型的 UI 版本,它使用 DateTime 属性并将我的成员控制器绑定到它上面(而不是成员类型),我使用一个小函数将它转换为我的原始成员类型。我将其命名为 memberviewmodel(但我不确定这个名称是否合适)。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,FirstName,BirthDay,Email,MobilePhone,LandLinePhone,PostalCity,PostalCode,PostalAdress,Gender,MedicalCertificate,MedicalCertificateStart,MedicalCertificateEnd,ProfilePicture")] **MemberViewmodel membervm**)
{
Member member = ModelViewmodelConverter.MemberViewmodelToMember(membervm);
if (ModelState.IsValid)
{
_context.Add(member);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(member);
}
函数:
public static Member MemberViewmodelToMember(MemberViewmodel vm)
{
Member result = new Member()
{
...
BirthDay = DateOnly.FromDateTime(vm.BirthDay),
...
}
return result;
}