2012-12-27 76 views
0

我有一個很難從一個小的選擇題問卷發佈到控制器在我MVC4應用程序獲得的值:MVC4:視圖模型(與單選按鈕列表)爲空後HttpPost

這個模型看起來是這樣的:

public class Evaluation 
{ 
    public int Id { get; set; }  
    public IEnumerable<MultipleChoiceQuestion> Question { get; set; }  
    public Remark Rem { get; set; } 
} 

public class MultipleChoiceQuestion 
{ 
    public int Id { get; set; }  
    public string Question { get; set; }  
    public MultipleChoiceAnswer Answer { get; set; } 
} 

public enum MultipleChoiceAnswer 
{ 
    DISAGREE, 
    NEUTRAL, 
    AGREE, 
    NA, 
} 

這是視圖(留出一些標記):

@model Models.Evaluation 

@using (Html.BeginForm("EvaluationB", "Evaluation", FormMethod.Post)) 
{ 
     @foreach (var item in Model.Question) 
      { 
       @Html.DisplayFor(model => item.Question) 
       @Html.EditorFor(model => item.Question, "Enum_RadioButtonList", new { Id = item.Id }) 
      } 
      @Html.Label("Remark") 
      @Html.TextAreaFor(model => model.Rem) 

       <input type="submit" value="Next" /> 
} 

的 「Enum_RadioButtonList」 是一個視圖從這裏抓起:https://gist.github.com/973482。這似乎是最好的方式在一個單選按鈕列表顯示枚舉值(THO他們應該在MVC 4更簡單的方法)

的控制器是這樣的:

public ActionResult EvaluationA() 
    { 
     Models.Evaluation evm = new Models.Evaluation(); 
     evm.Question = db.MultipleChoiceQuestions.ToList(); //feeding the View some predefined questions 
     return View(evm); 
    } 

    public ActionResult EvaluationB(Models.Evaluation ev) 
    { 
     if (ModelState.IsValid) 
     { 
      // TODO: save model 
      return View("EvaluationB", evm); 
     } 

     return View("EvaluationA", ev); 
    } 

的問題在查看加載罰款,但由於某種原因,張貼到控制器的模型在HttpPost之後仍然是空的,我不明白爲什麼。

+0

請添加源HTML – Mediator

+0

變化'返回視圖(「EvaluationB」,EVM);'到'返回視圖(「EvaluationB 「,ev);' –

回答

0

香港專業教育學院做了一些調查研究偶然發現了這個帖子解釋道:

http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

問題是在html字段的命名。伊夫加入我的觀像這樣,現在我能正確地讀出在控制器中的值:

@for (int i = 0; i < 6; i++) 
    { 
    <tr> 
     <td> 
      @Html.DisplayFor(m => m.Question[i].Question) 
     </td> 
     <td class="mult_question"> 
      @Html.EditorFor(m => m.Question[i].Answer, "Enum_RadioButtonList") 
     </td> 
    </tr> 
    } 

<tr> 
    <td> 
     @Html.Label("Remark") 
     @Html.TextAreaFor(m => m.Remark) 
0

我沒有看到形式具有的ID映射象下面這樣:

@Html.HiddenFor(model => model.Id) 

每一個問題的內收集也應該有ID,以便它與形式一起發佈的。因此,在您的形式,每題foreach循環裏面,你可以有:

@Html.HiddenFor(model => item.Question.Id) 

而且該模型具有類型MultipleChoiceQuestion的集合。對於模型綁定到集合中的集合元素的名稱應具有name屬性與有序的數字作爲在這個崗位http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

+0

嗨Abhijit,謝謝你的快速回答。 缺少的Id確實是正確的方向,雖然加入@ Html.HiddenFor(model => model.Id)似乎沒有幫助。此外,item.Question.Id不可訪問。 香港專業教育學院望着小提琴手什麼已經公佈,這似乎是確定:1​​item.Question =不同意與2item.Question =不同意與3item.Question =正中4item.Question =同意與TL 生病了看看菲爾哈克文章 – stefjnl