可为空的 DateTime 的 Datepicker 绑定不正确

Posted

技术标签:

【中文标题】可为空的 DateTime 的 Datepicker 绑定不正确【英文标题】:Datapicker for nullable DateTime binds incorrectly 【发布时间】:2014-06-02 17:00:13 【问题描述】:

我有这个问题,我的项目实体中有 2 个属性:

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "dd/MM/yyyy", ApplyFormatInEditMode = true)]
    public DateTime? StartDate  get; set; 

    [DisplayFormat(DataFormatString = "dd/MM/yyyy", ApplyFormatInEditMode = true)]
    [DataType(DataType.Date)]
    public DateTime EndDate  get; set; 

在我看来,我有以下代码。

<div class="control-group">
    <label class="control-label" for="prependedInput">@Resources.Project.StartDate</label>
    <div class="controls">
        <div class="input-prepend">
            <input type="text" name="StartDate" class="input-small datepicker" value="@DateTime.Now.ToDateFormat()" />
        </div>
    </div>
</div>

<div class="control-group">
    <label class="control-label" for="prependedInput">@Resources.Project.EndDate</label>
    <div class="controls">
        <div class="input-prepend">
            <input type="text" name="EndDate" class="input-small datepicker" value="@DateTime.Now.ToDateFormat()" />              
        </div>
    </div>
</div>

在我的控制器中,我试图创建一个新对象,但 ModelState.IsValid 总是返回 false,因为 StartDate 的值为空。

   public virtual ActionResult Create(Project model)
    
        if (ModelState.IsValid)
        
            Repository.Project.Add(model);
            return RedirectToAction(MVC.Project.Index());
        
        return View(model);
    

如何解决这个问题并将我的可为空的 StartDate 属性的值设置为使用 datepicker 选择的日期?

【问题讨论】:

【参考方案1】:

DisplayFormat 属性在绑定数据时对DateTime? 没有影响。由于此默认数据绑定器预计日期为标准格式 f.e. YYYY-MM-dd

如果您想以不同的格式绑定日期时间,请使用自定义数据绑定器。您可以在这里找到解决方案:

http://blog.greatrexpectations.com/2013/01/10/custom-date-formats-and-the-mvc-model-binder/

它应该可以完美解决您的问题。

【讨论】:

以上是关于可为空的 DateTime 的 Datepicker 绑定不正确的主要内容,如果未能解决你的问题,请参考以下文章

可为空的 DateTime 的 Datepicker 绑定不正确

如何在 VB.NET 中将可为空的 DateTime 设置为空?

将可为空的 DateTime 字段更新为 null 会导致默认 DateTime 值 (0001-01-01 00:00:00.0000000)

将可为空的 int 映射到可为空的 int + automapper

C#中 ?? ? ?: ?.?[ ]

检查可为空的布尔值是不是为空[重复]