2011-01-05 77 views
1

我在我的HomeController下面的代码:ASP.NET MVC序列不包含任何元素

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"); 

    } 

这是编辑方法的观点:

<% 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> 

<% } %> 

当我点击提交按钮我得到的错误:序列不包含此行上的元素:var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();

问题是什么?我如何解决它。谢谢

回答

1

您需要确定的是,当您编辑记录时,您需要告诉数据库要编辑的记录。除非您明确告诉模型使用该ID(请参阅我的第二个选项),否则仅在查询字符串中包含ID是不够的,但最简单的方法是在表单中添加该字段。

<% using (Html.BeginForm()) {%> 
<%= Html.HiddenFor("storyId") %> 
    <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> 

<% } %> 

第二个选项显示了如何通过Querystring将它提交给Action后指定storyId。你只需要确保表单的动作包括?storyId=[n]

[ValidateInput(false)] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Article ArticleToEdit, int storyId) 
{ 

    ArticleToEdit.storyId = storyId; 

    if (ModelState.IsValid) { 
     _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit); 
     _db.SaveChanges(); 
     return RedirectToAction("Index"); 

    } else { 
     return View(ArticleToEdit); 
    } 
} 

我也建议使用类似AutoMapper映射ArticleToEditArticleSet,这样你就不需要作出额外的数据库查询只是为了抢原创文章。基本上,如果您能够将ArticleToEdit映射到ArticleSet模型,则可以使用LINQ to SQL在不首先查询storyId的情况下执行更新。

3

问题是你没有什么能够符合你在_db.ArticleSet的linq查询。首先会抛出一个空集合。

尝试FirstOrDefault()如果返回null是好的。如果没有匹配,则FirstOrDetault()将返回null。

3

您没有在您的HTML表单中包含该文章的ID。如果您调试ArticleToEdit对象可能是null或具有零storyId。

您应该在HTML表单中包含您的storyId。如果您不希望用户看到它,您可以将其作为隐藏字段来执行。例如:

<% using (Html.BeginForm()) {%> 
    <%= Html.HiddenFor("storyId") %> 
    ... 

在一个单独的说明,你应该切换到使用Single,而不是First。首先表明你想要一个集合中的第一个项目。单个表示你应该只有一个结果。

+0

噢,那也是。 ;) – jfar 2011-01-05 19:36:46

+0

+1你偷了我的答案;)你先 - 你赢了! – 2011-01-05 19:37:49

+0

好的,我该怎么做?谢谢。 – Cameron 2011-01-05 19:38:45

相关问题