Как передать дату контроллеру с помощью DatePicker в Asp.net MVC - PullRequest
0 голосов
/ 27 июня 2018

Я хочу отправить дату на контроллер, используя загрузчик даты и времени начальной загрузки, но получаю ошибку

Словарь параметров содержит пустую запись для параметра «дата» не обнуляемого типа '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

время начала и время окончания я легко получаю, но когда я пытаюсь с датой, то получаю это типа Ошибка

Словарь параметров содержит пустую запись для параметра «дата» не обнуляемого типа 'System.DateTime' для мет

Обратите внимание, что я также пытаюсь установить ноль в случае сохранения даты.

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

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Я думаю, это потому, что у вас есть параметр с именем date в действии, но вы посылаете аргумент с именем DateSlosts. Таким образом, модель связующего не может связать вашу собственность. Если вы не хотите менять имена, вы можете использовать [Bind(Prefix = "DateSlots")] перед параметром действия date.

0 голосов
/ 27 июня 2018

Вы можете передать модель в качестве параметра в отличие от каждого отдельного свойства и вообще избежать преобразований:

[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" } })
0 голосов
/ 27 июня 2018

Это происходит потому, что при использовании инфраструктуры MVC значения передаются из представления в контроллер через name элемента HTML.

В вашей форме есть 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, вы используете Модель / Класс (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();
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...