ASP.NET MVC 5“ ModelState无效时”

时间:2018-12-17 11:24:15

标签: c# asp.net-mvc

我在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,当我提交空表格时,出现此“字符串未正确识别为有效的DateTime”异常。

2 个答案:

答案 0 :(得分:1)

输入内容可以是正确的日期和时间格式,正如您所说,用户可能没有提供。您可以使用TryParse方法,如果它是有效的日期时间值,它将安全地进行解析。所以你可以写:

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

return parsedDateTime;

或alternativley,您需要检查是否同时提供了日期和时间,然后通过检查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;
}

答案 1 :(得分:1)

尝试一下。我已经对其进行了测试,并且效果很好:

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"来从用户界面发送日期)。