如何在Asp.net MVC中使用DatePicker将日期传递给控制器

时间:2018-06-27 15:20:31

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

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

  

参数字典包含参数'date'的空条目   方法的非空类型'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然后得到这个  错误类型

  

参数字典包含参数'date'的空条目   甲基的非空类型'System.DateTime'

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

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

3 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为使用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)

OR

更好的解决方案

好像在使用EditorFor一样,您在视图顶部使用的是Model / Class(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();
}

我希望这会有所帮助。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

[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" } })