可为 Null 的对象必须具有值 ASP.NET MVC 日期时间选择器

Nullable object must have a value ASP.NET MVC datetime picker

真的很困惑为什么我的视图在将数据保存到控制器时没有将数据绑定到模型中。我使用 Jquery 日期时间选择器创建了这个 UI。在提交按钮消息引发后 "Nullable object must have a value" 尝试调试并且此错误指示到我的日期开始和日期结束视图,因为这些数据从未绑定(没有 value/null)到型号。

基于 UI 我想使用 EF 将这些数据保存到 sql 服务器数据库中。我的模型是日期时间类型。

我的模特:

public class OvertimeRequestModel
{
    public int OvertimeId { get; set; }
    public string OvertimeCode { get; set; }
    public DateTime? DateStart { get; set; } //datetime format
    public DateTime? DateEnd { get; set; } //datetime format
    public string Notes { get; set; }
}

我在视图中使用了 texboxfor:

 <div class="input-group col-xs-10 col-sm-5">
    @Html.TextBoxFor(m => m.DateStart, @"{0:MM/dd/yyyy HH:mm:ss}", new { @class = "form-control", @id = "date-timepicker1", @placeholder = "select date start", required = "required", @autocomplete = "off" })
    <span class="input-group-addon">
        <i class="fa fa-clock-o bigger-110"></i>
    </span>
</div>

 <div class="input-group col-xs-10 col-sm-5">
    @Html.TextBoxFor(m => m.DateEnd, @"{0:MM/dd/yyyy HH:mm:ss}", new { @class = "form-control", @id = "date-timepicker2", @placeholder = "select date End", required = "required", @autocomplete = "off" })
    <span class="input-group-addon">
        <i class="fa fa-clock-o bigger-110"></i>
    </span>
</div>

我的javascript:

<script type="text/javascript">
    //$(document).ready(function(){
    jQuery(function ($) {

        if (!ace.vars['old_ie']) $('#date-timepicker1').datetimepicker({
            format: 'MM/DD/YYYY HH:mm:ss',//use this option to display seconds
            icons: {
                time: 'fa fa-clock-o',
                date: 'fa fa-calendar',
                up: 'fa fa-chevron-up',
                down: 'fa fa-chevron-down',
                previous: 'fa fa-chevron-left',
                next: 'fa fa-chevron-right',
                today: 'fa fa-arrows ',
                clear: 'fa fa-trash',
                close: 'fa fa-times'
            }
        }).next().on(ace.click_event, function () {
            $(this).prev().focus();
        });

        if (!ace.vars['old_ie']) $('#date-timepicker2').datetimepicker({
            format: 'MM/DD/YYYY HH:mm:ss',
            icons: {
                time: 'fa fa-clock-o',
                date: 'fa fa-calendar',
                up: 'fa fa-chevron-up',
                down: 'fa fa-chevron-down',
                previous: 'fa fa-chevron-left',
                next: 'fa fa-chevron-right',
                today: 'fa fa-arrows ',
                clear: 'fa fa-trash',
                close: 'fa fa-times'
            }
        }).next().on(ace.click_event, function () {
            $(this).prev().focus();
        });
    });
</script>

我的控制器:

OvertimeRequest over = new OvertimeRequest();
over.OvertimeCode = model.OvertimeCode;
over.DateStart = model.DateStart; //always get null value
over.DateEnd = model.DateEnd; //always get null value
over.Notes = model.Notes;
db.OvertimeRequest.Add(over);
db.SaveChanges();

需要建议,谢谢。

查看

 @Html.TextBoxFor(model => model.StartDate, "{0:dd.MM.yyyy}", new { @class = "date-picker fullwidth", data_date_format = "dd.mm.yyyy" })

Js

$(".date-picker").datepicker({ autoclose: true, todayHighlight: true });

型号

public DateTime StartDate { get; set; }

终于有点小技巧解决了这个问题。只需将我的数据类型从日期时间更改为字符串即可。问题是因为 html 助手无法识别存储到控制器中的日期时间格式。

public string DateStart { get; set; } 
public string DateEnd { get; set; } 

查看与上面相同的帖子:

@Html.TextBoxFor(m => m.DateEnd, @"{0:MM/dd/yyyy HH:mm:ss}", new { @class = "form-control", @id = "date-timepicker2", @placeholder = "select date End", required = "required", @autocomplete = "off" })

保存此数据的控制器是:

OvertimeRequest over = new OvertimeRequest();
over.OvertimeCode = model.OvertimeCode;
over.DateStart = DateTime.ParseExact(model.DateStart, "MM/dd/yyyy HH:mm:ss", null); //i think this is the most important thing
over.DateEnd = DateTime.ParseExact(model.DateEnd, "MM/dd/yyyy HH:mm:ss", null); //i think this is the most important thing
over.Notes = model.Notes;
db.OvertimeRequest.Add(over);
int result = db.SaveChanges();

终于一切顺利。