首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于asp .net的DateOnly输入

用于asp .net的DateOnly输入
EN

Stack Overflow用户
提问于 2021-11-18 14:56:02
回答 2查看 177关注 0票数 1

我正在使用mvc .net核心(.net 6.0)创建一个链接到数据库的应用程序,我有一个问题:我搭建了一个控制器及其视图(创建、编辑...)但是当我尝试用entity框架创建一个发送到数据库的对象时,DateOnly类型的字段将不起作用,并为我试图写入的所有日期输入这个日期: 292269055-12-03 (这似乎是最大值?)。出于兼容性原因,我需要使用datetime类型,因为DB有日期字段(我在https://www.npgsql.org/doc/types/datetime.html中找到了此信息,如果我尝试使用datetime,它不起作用)。

这是我的代码: view:

代码语言:javascript
复制
<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>

控制器(自动生成):

代码语言:javascript
复制
[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);
}

最后,我尝试处理的模型:

代码语言:javascript
复制
[Required]
public DateOnly BirthDay { get; set; }
[NotMapped]
public DateTime BirthDayUI
{
   get => BirthDay.ToDateTime(new TimeOnly());

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

getter可以完美地工作,但setter不能,我不知道我必须改变什么。

谢谢你帮我

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-30 10:55:56

我最终找到了一个解决方案:我创建了我的成员模型的一个UI版本,它使用DateTime属性并在其上绑定我的成员控制器(而不是成员类型),并且我使用一个小函数将它转换为我原来的成员类型。我将其命名为成员视图模型(但我不确定它的名称是否合适)。

代码语言:javascript
复制
        [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);
            }

函数:

代码语言:javascript
复制
 public static Member MemberViewmodelToMember(MemberViewmodel vm)
        {
            Member result = new Member()
            {
                ...
                BirthDay = DateOnly.FromDateTime(vm.BirthDay),
                ...
            }
            return result;
        }
票数 0
EN

Stack Overflow用户

发布于 2021-11-18 15:43:05

我还没有使用.NET 6的经验,但我对此做了一些研究。https://devblogs.microsoft.com/dotnet/date-time-and-time-zone-enhancements-in-net-6/

我找到了下一行

代码语言:javascript
复制
DateOnly d3 = DateOnly.ParseExact("31 Dec 1980", "dd MMM yyyy", CultureInfo.InvariantCulture);  // Custom format

尝试在setter上使用它,如下所示:

代码语言:javascript
复制
set => BirthDay =  DateOnly.ParseExact(value.ToShortDateString(), "dd MMM yyyy", CultureInfo.InvariantCulture);

不要忘记指定格式和cultureinfo

如果这行得通,请让我知道!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70022020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档