2016-02-18 12 views
0

我在視圖中以編輯模式在集合中顯示項目列表。編輯完文件後,我想提交。但我無法回傳列表。列表顯示爲空。無法提交MVC中的模型列表

這裏是我的看法

@model List<NewsLetter.Models.NewsLetterQuestions> 



@using (Html.BeginForm("GetAnswersfromUser", "NewsLetter", FormMethod.Post, null)) 
{ 
    @Html.AntiForgeryToken() 

foreach (var item in Model) { 


     <div> 
      @Html.DisplayFor(modelItem => item.Question) 
     </div> 

     <div> 
      @Html.TextAreaFor(modelItem => item.Answer) 
     </div> 

} 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Submit" class="btn btn-default" /> 
      </div> 
     </div> 

} 

這裏是我的控制器

public ActionResult GetAnswersfromUser(string id) 
     { 
      id = "56c5afc9afb23c2df08dd2bf"; 
      List<NewsLetterQuestions> questions = new List<NewsLetterQuestions>(); 
      var ques = context.NewsLetterQuestionCollection.Find(Query.EQ("NewsLetterId", id)); 
      foreach(var x in ques) 
      { 
      questions.Add(x); 
      } 

      return PartialView(questions); 
     } 

     [HttpPost] 
     public ActionResult GetAnswersfromUser(List<NewsLetterQuestions> nql) 
     { 

      string id = "56c5afc9afb23c2df08dd2bf"; 
      foreach (var item in nql) 
      { 
       var query = Query.And(Query.EQ("NewsLetterId", id), Query.EQ("Question", item.Question)); 
      var update=Update<NewsLetterQuestions> 
            .Set(r => r.Answer, item.Answer); 
      context.NewsLetterQuestionCollection.Update(query,update); 

      } 
      return RedirectToAction("NewsLetterIndex"); 

     } 

當我點擊提交它拋出錯誤。

System.NullReferenceException:未將對象引用設置爲對象的實例。 在行 foreach(var item in nql)

這意味着nql爲空。

+0

我想你忘記了添加輸入元素與ID = nql,因此爲null。在Form中,你必須使用與模型中相同的id。 – Musketyr

+0

@Musketyr對不起,你可以請你告訴我我犯了什麼錯誤。我已將NewsLetterQuestions列表作爲參數。 – Shahzad

+0

您可以檢查POST請求(Chrome中的開發人員工具)以查看正在發佈的內容嗎? –

回答

3

爲了讓模型綁定到能夠結合發佈數據,所有的輸入名字必須在[N].Property的格式,其中N是的索引項目在列表中。爲了剃刀正常地生成輸入姓名,然後,你需要傳遞一個索引項,這意味着你需要一個for循環,而不是一個foreach

@for (var i = 0; i < Model.Count(); i++) 
{ 
    ... 

    @Html.TextAreaFor(m => m[i].Answer) 

    ... 
} 
+0

它工作。我怎麼忘記了foreach是隻讀的。順便說一句,謝謝你的幫助先生。 – Shahzad

-1

你永遠不會將列表傳遞迴控制器的Post處理程序。您需要將列表路由回控制器。

你應該做類似這樣的未經測試的代碼的東西:)

Html.BeginForm("Index", "Home", new { @nql=Model }, FormMethod.Post) 

看看這篇文章也是如此。它類似於您的問題:Pass multiple parameters in Html.BeginForm MVC4 controller actionPass multiple parameters in Html.BeginForm MVC

+0

它現在不拋錯誤,但仍然NQL不包含任何價值 – Shahzad

+0

爲哦好萬物的愛和聖潔,不,不要把整個模型作爲一個frickin查詢字符串參數。此外,這甚至不起作用,因爲帖子會覆蓋查詢字符串。 –

+0

@ChrisPratt我只是簡單地給他傳遞他需要回到控制器的物品的概念。他顯然錯過了一些東西。我沒有爲他寫出確切的代碼,而是提供了可以滿足他需求的以前回答的問題的鏈接。 – Mikanikal