我的MovieController中有Add和Edit操作,它们都会转到MovieForm视图。在MovieForm视图中,我有以下内容:
@Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:MMM dd yyyy}", new { @class = "form-control" })还请参阅我的相应电影模型:
public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
public Genre Genre { get; set; }
[Required]
[Display(Name = "Genre")]
public byte GenreId { get; set; }
[Display(Name ="Release Date")]
public DateTime ReleaseDate { get; set; }
public DateTime DateAdded { get; set; }
[Display(Name = "Number in Stock")]
public int NumberInStock { get; set; }
}和ViewModel:
public class MovieFormViewModel
{
public IEnumerable<Genre> Genres { get; set; }
public Movie Movie { get; set; }
public bool IsNew { get; set; }
}
}因此,正如您所看到的,ReleaseDate属性似乎没有任何问题。在数据库(localDB)中,它的类型是"datetime“。
然而,奇怪的是,每当我编辑一部电影并改变发行日期,一切都很好。但是,如果我添加了一部电影(尽管它是相同的MovieForm),我就会得到这样的例外:
将datetime2数据类型转换为日期时间数据类型会导致超出范围的值。声明已被终止。
我已经试过所有的步骤,尝试尝试捕捉,但是上面的错误是我能从正在发生的事情中提取出来的唯一的东西。对我来说,使用完全相同的表单和完全相同的Save()操作来编辑和成功地写入数据库是没有意义的,但是由于某种原因,当涉及到创建一个新条目时,它就不能工作了。如果我以完全相同的方式将日期直接输入到DB中,它甚至会工作。
我也看到过this question,但是它并没有解决我正在处理的问题。我甚至会在这里提供我的这两种行为,这样你就可以看到它们:
public ActionResult Edit(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
//Make sure that the id actually exists:
if (movie == null)
{
return HttpNotFound();
}
var viewModel = new MovieFormViewModel
{
Movie = movie,
IsNew = false,
Genres = _context.Genres.ToList()
};
return View("MovieForm", viewModel);
}
public ActionResult Save(Movie movie)
{
if (movie.Id == 0)
{
_context.Movies.Add(movie);
}
else
{
//This method of data entry allows you to explicitly control which items in the Db can be updated by the user. More secured than an update-all method like TryUpdateModel()
var movieInDb = _context.Movies.Single(c => c.Id == movie.Id);
movieInDb.ReleaseDate = movie.ReleaseDate;
movieInDb.Name = movie.Name;
movieInDb.Genre = movie.Genre;
movieInDb.NumberInStock = movie.NumberInStock;
movieInDb.DateAdded = DateTime.Today.Date;
}
_context.SaveChanges();
return RedirectToAction("Index", "Movies");
}
public ActionResult New()
{
var genres = _context.Genres.ToList();
var viewModel = new MovieFormViewModel
{
Genres = genres,
IsNew = true
};
return View("MovieForm", viewModel);
}注意,异常发生在_context.SaveChanges()方法上。还请注意,我已经尝试删除movieInDb.DateAdded = DateTime.Today.Date;但这与此无关,因为我在遇到ReleaseDate异常后添加了它。我还试着玩DateTime格式的ReleaseDate,这也没有帮助。
发布于 2016-07-22 09:25:34
在MovieController中的Save()操作中,仔细查看if语句。因为只有在添加新电影时才会出现异常,这意味着在movie.Id == 0(新电影)的情况下出现了问题。问题是,movie.DateAdded属性是,而不是由表单设置的,因此根本没有设置它。这导致movie.DateAdded为null,从而引发异常。修复集movie.DateAdded等于提交数据库之前的当前日期,如下所示:
if (movie.Id == 0)
{
movie.DateAdded = DateTime.Now;
_context.Movies.Add(movie);
}https://stackoverflow.com/questions/38496969
复制相似问题