【问题标题】:DateOnly input for asp .net用于 asp .net 的 DateOnly 输入
【发布时间】:2021-12-29 11:18:30
【问题描述】:

我正在使用 mvc .net core (.net 6.0) 创建一个链接到数据库的应用程序,但我遇到了一个问题: 我搭建了一个控制器及其视图(创建、编辑...),但是当我尝试创建一个对象以使用实体框架发送到 db 时,DateOnly 类型的字段将不起作用并为我尝试的所有日期输入此日期写:292269055-12-03(这似乎是最大值?)。 出于兼容性原因,我需要使用 DateOnly 类型,因为数据库有日期字段(我在这里找到了此信息 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);
}

最后,我试图摆弄这个的模型:

[Required]
public DateOnly BirthDay { get; set; }
[NotMapped]
public DateTime BirthDayUI
{
   get => BirthDay.ToDateTime(new TimeOnly());

   set => BirthDay = DateOnly.FromDateTime(value);
}

getter 可以完美运行,但 setter 不行,我不知道我必须更改什么。

谢谢你帮助我

【问题讨论】:

    标签: c# .net asp.net-mvc entity-framework


    【解决方案1】:

    我终于找到了解决办法: 我创建了我的成员模型的 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;
            }
    

    【讨论】:

      【解决方案2】:

      我还没有使用 .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);
      

      别忘了指定格式和文化信息

      让我知道这是否有效!

      【讨论】:

      • 似乎它甚至没有传入setter,我认为问题在于控制器中的绑定
      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2023-03-17
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多