【问题标题】:How to Pass Date to Controller using DatePicker in Asp.net MVC如何在 Asp.net MVC 中使用 DatePicker 将日期传递给控制器
【发布时间】:2018-06-27 15:20:31
【问题描述】:

我想使用引导日期时间选择器将日期发送到控制器,但出现错误

参数字典包含参数“日期”的空条目 方法的不可为空类型“System.DateTime”

这是我的模型类

public class Slot
    {
        public DateTime DateSlots { get; set; }

        public DateTime Starttime { get; set; }

        public DateTime EndTime { get; set; }
    }

控制器

[httPost]
public ActionResult Createslots(string startTime, string endTime, DateTime date)
        {
            using (MYDb db = new MYDb())
            {
                Slot obj = new Slot();
                obj.Starttime = Convert.ToDateTime(startTime);
                obj.EndTime = Convert.ToDateTime(endTime);
                obj.DateSlots = date;
                db.Slots.Add(obj);
                db.SaveChanges();
            }
            return View();
        }
 // my Action
 public ActionResult Createslots()
        {
            return View();
        }

查看

   @using (Html.BeginForm("Createslots", "slot", FormMethod.Post))

    {
                    <div class="col-sm-6 form-group">
                        @Html.LabelFor(model => model.DateSlots )
                        @Html.EditorFor(model => model.DateSlots , new { htmlAttributes = new { @class = "form-control" } })
                    </div>
                    <div class="col-sm-6 form-group">
                        @Html.LabelFor(model => model.Starttime)
                        @Html.EditorFor(model => model.Starttime, new { htmlAttributes = new { @class = "form-control" } })
                    </div>
                    <div class="col-sm-6 form-group">
                        @Html.LabelFor(model => model.EndTime)
                        @Html.EditorFor(model => model.EndTime, new { htmlAttributes = new { @class = "form-control" } })
                    </div>
                    <input type="submit" class="btn text-center" value="Submit" style="background: rgb(15, 94, 125);" />
}

这里是前端 Img

开始时间和结束时间我很容易得到,但是当我尝试使用 Date 然后得到这个 错误类型

参数字典包含参数“日期”的空条目 meth 的不可为空类型“System.DateTime”

注意,我也尝试在日期存储为 null 的情况下为 null

 public ActionResult Createslots(string startTime, string endTime, DateTime ? date)
        {
}

【问题讨论】:

  • 我发现在处理日期时,将它们视为字符串然后在后端或插入数据库时​​将它们转换为 DateTime 会更容易。由于您的 ActionResult 需要字符串作为开始和结束,为什么不将所有三个模型属性都设为字符串,因为字符串可以作为空值传递?或者,如果您仍想在模型中使用 DateTime 对象,请将相应的模型属性更改为 Nullable Datetime
  • @RyanWilson 我尝试 tis 但收到此错误将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。声明已终止。
  • @zubairzubairgone 听起来像是将日期时间传递给 sql 的问题,(stackoverflow.com/questions/1331779/…)
  • @RyanWilson “我发现在处理日期时,将它们视为字符串更容易,然后在后端或插入数据库时​​将它们转换为 DateTime”......这只会让在流程的早期验证模型,因为日期解析必须手动进行。这没有任何优势。 MVC 可以将请求中提交的字符串(当然,它们在传输时始终是字符串)解析为 Dates 没问题,只要提供的字符串格式有效。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

我认为这是因为您在操作中有一个名为 date 的参数,但您发送的参数名称为 DateSlosts。因此,模型绑定器无法绑定您的属性。如果不想改名字,可以在动作参数date前使用[Bind(Prefix = "DateSlots")]

【讨论】:

    【解决方案2】:

    您可以将模型作为参数而不是每个单独的属性传递,并完全避免转换:

    [HttpPost]
    public ActionResult Createslots(Slot slot)
    {
      using (MYDb db = new MYDb())
      {
        db.Slots.Add(slot);
        db.SaveChanges();
      }
      //return to whatever
    }
    

    此外,您可以在模型中使用 DisplayFormat 属性并在视图中使用 HTML5 日期选择器:

    public class Slot
    {
      [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
      public DateTime DateSlots { get; set; }
      [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
      public DateTime Starttime { get; set; }
      [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
      public DateTime EndTime { get; set; }
    }
    

    查看:

    @Html.EditorFor(model => model.EndTime, new { htmlAttributes = new { @class = "form-control", type= "date" } })
    

    【讨论】:

    • 是的,将整个模型传递给控制器​​动作将起作用,而不必执行每个单独的属性。但关键是,参数的名称与元素的名称不同在表格上。
    • @M12Bennett 是的。但重点应该是可以通过减少编码并专注于最佳实践来完全忽略该问题。
    • 在这方面与您没有异议。我只是说你的答案会起作用,但请解释为什么他们目前的做法不是。这对您和 OP 是互惠互利的,因为您可以教/解释原因,并且 OP 可以从他们的错误中吸取教训。最重要的是,它加强了 OP 对 MVC 框架如何运作的基本概念的理解。
    【解决方案3】:

    这是因为在使用 MVC 框架时,值是通过 HTML 元素的 name 从视图提交到控制器的。

    在您的表单中,您有 3 个文本框:

    DateSlots - StartTime - EndTime

    所以,当你像这样使用Html.EditorFor 模板时:

    @Html.EditorFor(model => model.DateSlots , new { htmlAttributes = new { @class = "form-control" } })
    

    这样翻译成 HTML:

    <input type="text" id="DateSlots" name="DateSlots" class="form-control" />
    

    因此,在您的控制器中,您需要一个基于参数名称 date 的值,但请注意上面的名称是 DateSlots

    简而言之,您只需将参数名称更改为dateSlots

    [HttPost]
    public ActionResult Createslots(string startTime, string endTime, DateTime dateSlots)
    

    更好的解决方案

    看起来好像您正在使用 EditorFor,您正在视图顶部使用模型/类 (Slots),因此您可以在控制器中执行此操作:

    [HttPost]
    public ActionResult Createslots(Slot mySlot)
    {
        using (MYDb db = new MYDb())
        {
            Slot obj = new Slot();
            obj.Starttime = Convert.ToDateTime(mySlot.StartTime);
            obj.EndTime = Convert.ToDateTime(mySlot.EndTime);
            obj.DateSlots = mySlot.DateSlots;
            db.Slots.Add(obj);
            db.SaveChanges();
        }
        return View();
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 好的是的,它可以工作,但我不是从 获得值形式的日期选择器跨度>
    • 你如何告诉EditorForDateSlots 使用日期选择器?
    • 我对日期选择器的问题感到困惑。您的问题是问为什么没有将值提交给控制器。我的解决方案应该解决这个问题。
    • @ADyson 同意。我认为这个日期选择器对话正在远离主要问题。现在,OP 使用日期选择器选择日期还是手动输入日期都无关紧要了。现在该文本框中的任何值都应该提交给控制器。
    • @zubairzubairgone 如果这回答了您的问题,请将此答案标记为已接受,以便可以将问题视为已回答。
    猜你喜欢
    • 2015-07-09
    • 2013-10-23
    • 2017-03-22
    • 1970-01-01
    • 2010-09-14
    • 2011-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多