我想使用引导日期时间选择器将日期发送到控制器,但出现错误
参数字典包含参数'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)
{
}
答案 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" } })