ASP.NET MVC 5 "Когда недействительно ModelState" - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть небольшая проблема в asp.net MVC.Я собираюсь опубликовать весь код, а затем я объясню его.

ViewModel.

public class EventFormViewModel
{
   [Required]
   public string studentId{ get; set; }
   [Required]
   public string location{ get; set; }
   [Required]
   public string Date { get; set; }
   [Required]
   public string Time { get; set; }

  // Date and Time == DataTime.
  public DateTime GetDateTime()
  {
      var Datetime = DateTime.Parse(string.Format("{0} {1}", Date, Time));
      return Datetime;
  }
}

Когда состояние модели недопустимо, фреймворк MVC - MVCФреймворк вызвал этот метод действия и использует отражение для создания этого viewmModel (все свойства только не метод.) и в этом случае GetDateTime() является методом.Почему я получаю это исключение?

Контроллер

        [Authorize]
        [HttpPost]
        public ActionResult NewEvent(EventFormViewModel viewModel) 
        {
            if (!ModelState.IsValid)
            {
                 return RedirectToAction("Index","Home");
            }

            var _event= new _Event
            {
                studentId = User.Identity.GetUserId(),
                DateTime = viewModel.GetDateTime(),
                location = viewModel.location
            };

            _Dbcontext._Events.Add(_event);
            _Dbcontext.SaveChanges();

            return RedirectToAction("Index","Home");
        }

Когда я запускаю свой код.Я получаю эту ошибку.

enter image description here

Проблема: В моем viewModel отмечены все обязательные поля.S0, когда я отправляю пустую форму, я получаю это исключение "Строка не была распознана как действительное значение даты / времени".

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Попробуй это.Я протестировал его, и он отлично работает:

public DateTime GetDateTime()
{
    var inputDate = DateTime.ParseExact(this.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
    var inputTime = TimeSpan.Parse(this.Time);
    DateTime datetime = inputDate + inputTime;
    return datetime;
}

В приведенном выше коде вместо "dd/MM/yyyy" используйте свой собственный формат, в котором дата отправляется из пользовательского интерфейса.

0 голосов
/ 17 декабря 2018

Введенные данные могут быть в правильном формате даты и времени, и, как вы сказали, пользователь может этого не предоставлять.Вы можете использовать метод TryParse, который безопасно проанализирует, если это допустимое значение даты и времени.Таким образом, вы можете написать:

DateTime parsedDateTime;
bool isParsed = DateTime.TryParse(string.Format("{0} {1}", Date, Time),out parsedDateTime);

return parsedDateTime;

или альтернативно, вам нужно проверить, указаны ли дата и время, а затем проанализировать их, проверив условие if:

public DateTime GetDateTime()
{
  DateTime dateTime = DateTime.MinValue;
  if(!String.IsNullOrEmpty(Date) && !String.IsNullOrEmpty(Time))
       dateTime= DateTime.Parse(string.Format("{0} {1}", Date, Time));

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