我的 HomeController 中有以下代码:
public ActionResult Edit(int id) { var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First(); return View(ArticleToEdit); } [ValidateInput(false)] [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(Article ArticleToEdit) { var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First(); if (!ModelState.IsValid) return View(originalArticle); _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit); _db.SaveChanges(); return RedirectToAction("Index"); }
这是 Edit 方法的视图:
<% using (Html.BeginForm()) {%> <fieldset> <legend>Fields</legend> <p> <label for="headline">Headline</label> <%= Html.TextBox("headline") %> </p> <p> <label for="story">Story <span>( HTML Allowed )</span></label> <%= Html.TextArea("story") %> </p> <p> <label for="image">Image URL</label> <%= Html.TextBox("image") %> </p> <p> <input type="submit" value="Post" /> </p> </fieldset> <% } %>
当我点击提交按钮时,我收到错误:{"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}任何想法是什么问题?我假设编辑方法正在尝试将数据库中的发布值更新为已编辑的值,但由于某种原因它不喜欢它......虽然我不明白为什么涉及日期,因为它没有在控制器编辑方法?
{"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}
问题是您使用ApplyPropertyChanges的模型对象仅填充了表单中的数据(标题、故事和图像)。 ApplyPropertyChanges将更改应用于对象的所有属性,包括DateTime设置为 0001-01-01 的 uninitialized ,这超出了 SQL Server 的DATETIME.
ApplyPropertyChanges
DateTime
DATETIME
我建议不要使用ApplyPropertyChanges,而是检索正在修改的对象,更改表单编辑的特定字段,然后使用这些修改保存对象;这样,只修改更改的字段。或者,您可以在页面中放置隐藏的输入并填充其他字段,但这对并发编辑不是很友好。
更新:
这是一个未经测试的示例,仅更新对象的某些字段(假设您使用的是 LINQ to SQL):
var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId); story.headline = ArticleToEdit.headline; story.story = ArticleToEdit.story; story.image = ArticleToEdit.image; story.modifiedDate = DateTime.Now; _db.SubmitChanges();