【问题标题】:Nullable object must have a value ASP.NET MVC datetime picker可空对象必须有一个值 ASP.NET MVC 日期时间选择器
【发布时间】:2019-12-30 23:55:08
【问题描述】:

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

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

我的模特:

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();

需要建议,谢谢。

【问题讨论】:

  • 如果您不使用datetimepicker 会发生什么?只是为了确保它不会干扰绑定,请尝试将其移除并检查绑定是否有效。
  • 如果是必填字段,为什么可以为空?
  • @RonBeyer 这只是实体框架的反映。
  • @PriyankPanchal 当我尝试删除 datetimepicker 时,我仍然得到 Null 值
  • over.DateStart - 这是否可以作为 model.DateStart 为空?如果不是,那么您必须分配值而不是像model.DateStart.value 这样的对象。或者让实体模型中的日期对象也可以为空。您还可以进行一些空值检查,例如 if(model.DateStart.Hasvalue),然后进行相应的分配。

标签: c# jquery asp.net-mvc datetimepicker


【解决方案1】:

查看

 @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; }

【讨论】:

  • 如果用户想将此字段留空,它如何将Null 存储在数据库中?如果该字段为空,用户不应该在那里看到任何默认日期,对吧?
【解决方案2】:

最后我有点棘手来解决这个问题。只需将我的数据类型从日期时间更改为字符串。问题是因为 html helper 无法识别日期时间格式以存储到控制器中。

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();

终于一切顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2010-12-26
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多