【发布时间】:2016-07-21 06:51:33
【问题描述】:
我的 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 数据类型转换为 datetime 数据类型 导致超出范围的值。声明已终止。
我已尝试逐步完成所有操作并尝试尝试捕获,但上述错误是我可以从正在发生的事情中提取的唯一内容。对我来说,我可以使用完全相同的表单和完全相同的 Save() 操作编辑并成功写入数据库,但由于某种原因,当涉及到创建新条目时,它不起作用。如果我以完全相同的方式将日期直接输入数据库,它甚至会起作用。
我也见过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 的这个异常之后添加了它。我还尝试使用 ReleaseDate 的 DateTime 格式,但这也没有帮助。
【问题讨论】:
-
抛出错误是因为
ReleaseDate或DateAdded是DateTime.MinDate(01/01/0001) 并且超出范围。 (添加新的Movie时,您似乎没有设置DateAdded的值) -
当我在文本字段中输入日期并单击提交时,我不明白 ReleaseDate 怎么可能是 MinDate。
-
然后是
DateAdded- 调试你的代码! -
调试器告诉我“ReleaseDate 在当前上下文中不存在”,但事实并非如此 - 表单中正确包含
@Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:MMM dd yyyy}", new { @class = "form-control" })。在完全相同的模型中,其他所有属性都可以正常工作。
标签: c# asp.net-mvc entity-framework