C# 如何在Asp.net MVC中使用日期选择器将日期传递给控制器

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;

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

参数字典包含参数“日期”的空条目 方法的不可为Null的类型“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);" />
}

这是因为在使用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
for
DateSlots
使用日期选择器?我不清楚日期选择器是怎么出问题的。您的问题是询问为什么没有将值提交给控制器。。“我的解决方案应该能解决这个问题。”阿德森同意。我认为这次约会选择者的谈话偏离了主要问题。现在,OP是使用日期选择器选择日期,还是手动输入日期都不重要。。无论文本框中现在有哪个值,都应该提交给控制器。@zubairzubairgone,如果这回答了您的问题