【问题标题】:Reset DateTime input box to blank after failing ModelState.IsValidModelState.IsValid 失败后将 DateTime 输入框重置为空白
【发布时间】:2026-01-18 16:45:01
【问题描述】:

我在视图中有一个输入框,用于指定日期

如果用户将此留空,ModelState 将返回 false 并将模型返回到视图。

但是,在这种情况下,DateTime 字段随后将填充值 DateTime.MinValue (01/01/0001)

如何从模型中清除这个值,并返回一个空白输入框?

谢谢

【问题讨论】:

    标签: asp.net-mvc-4 datetime


    【解决方案1】:

    如果您没有验证,则在模型中将该日期定义为nullable

    DateTime? AnyDate {get; set;}
    

    这样,问题就解决了。当用户不输入AnyDate 时,发布后将是null。如果它不起作用,你可以写在行动中:

    if (!ModelState.IsValid)
    {
       //control for any case
       if(model.AnyDate == DateTime.MinValue) model.AnyDate = null;      
    } 
    

    【讨论】:

    • 这就是我最终要做的——我没有意识到我可以有一个带有 [Required] 注释的可空属性......现在如果没有输入任何内容,传递给控制器​​的值是null 并且验证失败 - 谢谢!
    【解决方案2】:

    如果要返回空值,则必须将模型的实体编辑为可为空,如下所示:

    public Class MyObject
    {
        String parameter {get; set;}
        DateTime? time {get; set;}
    }
    

    如果您想在重新渲染带有字段的页面之前更改用户输入的值,您必须将模型对象编辑为 DateTime.MinValue(例如),如下所示:

        public ActionResult MyMethod(MyObject model)
        {
        if (ModelState.IsValid)
            {
            ...
            } 
        else
            {
            model.time = DateTime.MinValue; 
            }
        return View(model);
        }
    

    【讨论】:

      【解决方案3】:

      一旦您 POST 回您的视图,您将需要使用 SetModelValue() 方法来操作您的 ModelState(而不是您的模型)中的值。或者,您可以Remove() 有问题的条目,但这有其他含义(即破坏您在 ModelStateDictionary 对象中的模型)。

      例如,如果您的数据元素被称为RequiredDateTime,那么您的控制器代码可能是:

      [HttpPost]
      [ValidateAntiForgeryToken]
      public ActionResult ThisAction(int id, YourModel model)
      {
          // Process the 'IsValid == true' condition
          if (ModelState.IsValid)
          {
              // ...
              return RedirectToAction("NextAction");
          }
      
          // Process the 'IsValid == false' condition
          if (ModelState.ContainsKey("RequiredDateTime"))
          {
              ModelState.SetModelValue("RequiredDateTime", new ValueProviderResult(...));
          }
      
          // ...
      
          return View(model);
      }
      

      编辑

      一些额外的研究发现了以下内容,另请参阅:

      MVC - How to change the value of a textbox in a post?

      How to modify posted form data within controller action before sending to view?

      我希望这会有所帮助。祝你好运!

      【讨论】:

        最近更新 更多