C# 如何在Asp.net MVC中使用日期选择器将日期传递给控制器
我想使用引导日期时间选择器将日期发送到控制器,但出现错误 参数字典包含参数“日期”的空条目 方法的不可为Null的类型“System.DateTime” 这是我的模型课C# 如何在Asp.net MVC中使用日期选择器将日期传递给控制器,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我想使用引导日期时间选择器将日期发送到控制器,但出现错误 参数字典包含参数“日期”的空条目 方法的不可为Null的类型“System.DateTime” 这是我的模型课 public class Slot { public DateTime DateSlots { get; set; } public DateTime Starttime { get; set; } public DateTime EndTime { get; set;
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);" />
}
这是因为在使用MVC框架时,值是通过HTML元素的
name
从视图提交到控制器的
在表单中,您有3个文本框:
日期槽
-
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" />
或
更好的解决方案
如果您使用的是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();
}
我希望这会有所帮助。这是因为在使用MVC框架时,通过HTML元素的
名称将值从视图提交到控制器
在表单中,您有3个文本框:
日期槽
-
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" />
或
更好的解决方案
如果您使用的是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();
}
我希望这会有所帮助。我认为这是因为您在操作中有一个名为date
的参数,但您发送的参数名为DateSlosts
。因此,模型绑定器无法绑定属性。如果您不想更改名称,可以在操作参数date之前使用[Bind(Prefix=“DateSlots”)]
,我认为这是因为在操作中有一个名为date
的参数,但您发送的参数名为DateSlosts
。因此,模型绑定器无法绑定您的属性。如果不想更改名称,可以在操作参数date
之前使用[Bind(Prefix=“DateSlots”)]
,您可以将模型作为参数传递,而不是每个单独的属性,并完全避免转换:
[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; }
}
视图:
您可以将模型作为参数传递,而不是每个单独的属性,并完全避免转换:
[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; }
}
视图:
我发现在处理日期时,更容易将其作为字符串处理,然后在后端或插入数据库时将其转换为DateTime。既然ActionResult需要开始和结束字符串,为什么不将所有三个模型属性都设为字符串,因为字符串可以作为空值传递?或者,如果您仍然希望在模型中使用DateTime对象,请将您的coresponding Model属性更改为可为空的DateTime请参阅此@RyanWilson i try,但出现此错误将datetime2数据类型转换为DateTime数据类型导致值超出范围。该语句已终止。@zubairzubairgone将日期时间传递给sql听起来像是个问题,()@RyanWilson“我发现在处理日期时,将其作为字符串处理,然后在后端或插入数据库时将其转换为日期时间更容易”…这使得在流程的早期验证模型变得更加困难,因为日期解析必须手动进行。这没有什么好处。MVC可以将请求中提交的字符串(当然,它们在传输时始终是字符串)解析为日期没有问题,只要提供的字符串格式有效。我发现在处理日期时,更容易将它们视为字符串,然后在后端或插入数据库时将其转换为日期时间。既然ActionResult需要开始和结束字符串,为什么不将所有三个模型属性都设为字符串,因为字符串可以作为空值传递?或者,如果您仍然希望在模型中使用DateTime对象,请将您的coresponding Model属性更改为可为空的DateTime请参阅此@RyanWilson i try,但出现此错误将datetime2数据类型转换为DateTime数据类型导致值超出范围。该语句已终止。@zubairzubairgone将日期时间传递给sql听起来像是个问题,()@RyanWilson“我发现在处理日期时,将其作为字符串处理,然后在后端或插入数据库时将其转换为日期时间更容易”…这使得在流程的早期验证模型变得更加困难,因为日期解析必须手动进行。这没有什么好处。MVC可以将请求中提交的字符串(当然,当它们被传输时总是字符串)解析为日期,没有问题,如果提供的字符串格式有效。好的,可以,但我从日期选择器中获取值,而不是从您如何告诉EditorFor
forDateSlots
使用日期选择器?我不清楚日期选择器是怎么出问题的。您的问题是询问为什么没有将值提交给控制器。。“我的解决方案应该能解决这个问题。”阿德森同意。我认为这次约会选择者的谈话偏离了主要问题。现在,OP是使用日期选择器选择日期,还是手动输入日期都不重要。。无论文本框中现在有哪个值,都应该提交给控制器。@zubairzubairgone,如果这回答了您的问题