2011-01-05 79 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

相關問題