首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将datetime2数据类型转换为日期时间数据类型异常( 1753/1/1之后的日期)

将datetime2数据类型转换为日期时间数据类型异常( 1753/1/1之后的日期)
EN

Stack Overflow用户
提问于 2018-11-06 17:30:18
回答 2查看 415关注 0票数 0

我向我的客户模型添加了一个属性,创建了一个迁移并更新了数据库。在DB中创建的字段是datetime。这是我的模型代码

代码语言:javascript
运行
复制
public DateTime BirthDate { get; set; }

这里的视图实际上是一个表单,我在其中插入日期和其他字段并提交表单。

代码语言:javascript
运行
复制
<div class="form-group">
    @Html.LabelFor(m => m.Customer.BirthDate)
    @Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyyy}", new { @class = "form-control" })
</div>

这是控制器中的动作

代码语言:javascript
运行
复制
     public ActionResult Save(Customer customer)
    {
        if (customer.Id == 0)
        {
            _context.Customers.Add(customer);
        }
        else
        {
            var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
            customerInDb = customer;
        }
        _context.SaveChanges();
        return RedirectToAction("Index", "Customers");
    }

我用23/04/1976编写了BirthDate字段,调试了应用程序并检查了customer.BirthDate的值,即23/04/1976 12:00:00日期是1753/1/1之前的备注,但我正在收到上述例外。

我还尝试了以下几种方法:

代码语言:javascript
运行
复制
public DateTime? BirthDate { get; set; }

异常已消失,但日期未保存到数据库。

从视图中删除甲酸"{0: dd-MM-yyy}“,但徒劳无功。

插入日期以不同的格式,如23-4月-1952年,1985-12-01和1987/1/2,但没有工作。

Visual 2013和数据库是visual的LocalDb

EN

回答 2

Stack Overflow用户

发布于 2018-11-06 21:48:47

错误通过使属性为空而消失这一事实给出了答案。如果设置了一个值,那么您将得到与字段为而不是可空时完全相同的错误。

因此,没有设置值,如果字段为空(通过您说它不存储值-它正在存储空值),它将存储一个空值。

因此,对于不可空属性,当未设置属性时,它将具有点net DateTime的默认值,即DateTime.MinValue,如果将其存储在SQL server datetime2中,而不是存储在datetime中,则该值是有效的,在datetime中将得到1753错误。

顺便说一句,我假设这个LocalDb基本上是基于1753错误的server。为了记录在案,您应该在SQL server中使用datetime2:DateTime2 vs DateTime in SQL Server

但是这个字段实际上是一个日期,所以您应该使用date SQL类型。

因此,总之,我怀疑传递给保存方法的客户中的BirthDate值具有DateTime.MinValue值。现在你得弄清楚为什么..。(但这是另一个问题)

你是故意使用dd-MM-yyy的吗?是否应该有额外的y

票数 0
EN

Stack Overflow用户

发布于 2018-11-07 01:52:33

实际问题在于DateTime视图模型属性和这个TextBoxFor助手:

代码语言:javascript
运行
复制
@Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyy}", new { @class = "form-control" })

根据当前区域性设置,这将生成具有指定日期格式的普通输入,该格式可能与服务器中的当前区域性设置不匹配,从而导致默认模型绑定器忽略其值,并使用DateTime.MinValue作为默认值(因为它不是可空类型),这不适合于最小值为1753-01-01datetime列类型(T中等效的System.DateTime类型是datetime2)。

最建议为DateTime属性创建输入助手的设置是使用DataTypeAttribute设置为DataType.DateDisplayFormatAttribute来指定格式字符串:

代码语言:javascript
运行
复制
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; }

然后,使用EditorForTextBoxFortype="date"属性生成日期输入:

代码语言:javascript
运行
复制
@* TextBoxFor *@
@Html.TextBoxFor(model => model.Customer.BirthDate, new { @class = "form-control", type = "date" }) 

@* EditorFor *@         
@Html.EditorFor(model => model.Customer.BirthDate, new { htmlAttributes = new { @class = "form-control" } })

注意:与上述设置相同的也适用于Nullable<DateTime>/DateTime?属性。

此外,在使用IsValid之前,您应该检查ModelStateSaveChanges()属性,并在验证失败时返回相同的视图:

代码语言:javascript
运行
复制
[HttpPost]
public ActionResult Save(Customer customer)
{
    if (ModelState.IsValid)
    {
        if (customer.Id == 0)
        {
            _context.Customers.Add(customer);
        }
        else
        {
            var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
            customerInDb = customer;
        }
        _context.SaveChanges();
        return RedirectToAction("Index", "Customers");
    }
    else
    {
        // validation failed, show the form again with validation errors
        return View(customer);
    }
}

相关问题:ASP.NET MVC date not saving when posting

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

https://stackoverflow.com/questions/53177030

复制
相关文章

相似问题

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