【问题标题】:How to check if a datetime value is empty or not in a put request如何检查放置请求中的日期时间值是否为空
【发布时间】:2018-12-28 17:31:13
【问题描述】:

在我的控制器中,我试图检查是否在 put 请求中传递了日期时间值,但是当我不发送该日期时间字段的值时,它会将数据库中的值重置为 01/01/ 0001/ 这是我的控制器中的代码,我如何检查它是否为空。(一点点)(检查 user.Age!)

[HttpPut("User/Edit/{userid}")]
    public IActionResult Update(string token, int userid, [FromBody]User user)
    {


        bool RoleId = JWTValidator.RoleIDTokenValidation(token);
        var edit = _context.users.Find(userid);
        if (RoleId)
        {
            if (user.Name != null)
            {
                edit.Name = user.Name;
            }
            else
            {
                edit.Name = edit.Name;
            }
            if (user.LastName != null)
            {
                edit.LastName = user.LastName;
            }
            else
            {
                edit.LastName = edit.LastName;
            }
            if (user.Age != null)
            {
                edit.Age = user.Age;
            }
            else
            {
                edit.Age = edit.Age;
            }

所以如果值为 null,它不会更新,但我想如果你不输入任何内容,它会将其视为 01/01/0001,所以我尝试像这样比较它

if(user.Age == "01/01/0001")

但我无法将日期时间类型与字符串进行比较。而且我也在使用这样的验证

if (ModelState.IsValid)
                {
                    _context.users.Update(edit);
                    _context.SaveChanges();
                }
                else
                {
                    return BadRequest(ModelState);
                }

我的年龄模型是

[Display(Name = "Your Birthday")]
    [DataType(DataType.Date, ErrorMessage = "Not a correct date format, MM/DD/YYYY please.")]
    public DateTime Age { get; set; }

但是如果我发送一个内容为 "Age": "test" 的 put 请求,它只会给我一个 500 内部错误而不是给我错误消息,我处理错了吗?

希望有人能帮帮我。

【问题讨论】:

  • 使用DateTime.MinValue 代替那个字符串。
  • 可能有助于使 DateTime 也可以为空。
  • 您不需要那些 else 语句,它们将属性设置为它自己的现有值...
  • 您真的在使用Age 来命名日期/时间值吗?你不觉得这会让人们感到困惑吗?当有人问你的年龄时,你不会说“1999 年 12 月 26 日”。你说,“我今年 19 岁。”请将变量命名为 BirthDate。这将是一个不那么令人困惑的日志。
  • 是的,抱歉,我本来打算这样做,但首先想解决这个问题@JimMischel

标签: c# asp.net-mvc validation httprequest put


【解决方案1】:

如果你正在寻找一些东西来代替这个 if(user.Age == "01/01/0001")

这里有一个简单的例子:如果是同一日期,则返回 0

DateTime dt = DateTime.ParseExact("01/01/0001 00:00:00", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); //Use your default date string and your format type
DateTime dt2 = DateTime.Now;//Use Your Specific Date
var dtComp = DateTime.Compare(dt, dt2);

【讨论】:

    【解决方案2】:

    您也可以将年龄声明为可为空,即:

    DateTime? user.Age  = new DateTime();
    

    然后您可以轻松地检查 null 并且也可以像这样简单地设置 edit.Age(如果您想要默认值):

    edit.Age = user.Age ?? new DateTime(1970,01,01);
    

    问候。

    【讨论】:

      【解决方案3】:

      听起来这里的问题是您需要将struct 与其默认值进行比较,而不是null。为此,您可以简单地使用default 关键字来获取该类型的默认值。请注意,您可以使用类和结构来执行此操作:

      if (user.Age != default(DateTime))
      {
          edit.Age = user.Age;
      }
      

      【讨论】:

      • 哦,我确实像 Nyer 所说的那样使用了 DateTime.MinValue 并且效果很好。但我会试试这个膨胀
      • 酷,有道理。 MinValue 恰好是 DateTime 的默认值,但是这个选项使您不必知道这一点,您可以将它用于任何类型,例如:if (user.LastName != default(string))
      • 但是我在这篇文章中提出了另一个问题,为什么当我输入日期时间类型的错误格式时,它会返回 500 服务器错误,例如“生日”:“测试”更改了年龄顺便说一句,生日。检查原始帖子以获取生日的验证声明和模型
      • 查看this question 的答案,了解如何显示错误消息。
      【解决方案4】:
      DateTime  myDate;
      if(myDate.Date == DateTime.MinValue)
      {
          //Do!
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 2023-04-11
        • 2016-10-24
        • 2013-03-01
        • 2019-10-13
        • 2017-06-30
        • 1970-01-01
        相关资源
        最近更新 更多