2017-08-24 60 views
0

嗨,大家好我有麻煩與我的mvc應用程序。它是一個簡單的測驗應用程序,我堅持創建問題模型的創建視圖。複雜類型的模型不會通過列表propery

我有問題和選擇模型與適當的視圖模型(在我的情況下,他們是QustionDTO和OptionDTO),我想使問題與選項列表的cshtml創建視圖。 like this但是當我提交表單時,我的選項列表爲空。 這是我的問題和期權定價模型

public class Question 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Required] 
    public string QuestionText { get; set; } 
    public virtual ICollection<Option> Options { get; set; } 
} 

public class Option 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Required] 
    [Display(Name ="Answer text")] 
    public string OptionText { get; set; } 
    [Required] 
    public bool IsCorrect { get; set; } 
} 

這是我的DTO模式

public class QuestionDTO 
{ 
    public int Id { get; set; } 
    public string QuestionText { get; set; } 
    public List<OptionDTO> Options { get; set; } 
} 
public class OptionDTO 
{ 
    public int Id { get; set; } 
    public string OptionText { get; set; } 
    public bool IsCorrect { get; set; } 
} 

,這是我與位於「〜/查看/共享/ editortemplate/OptionDTO.cshtml」編輯模板視圖

@model Quiz.BusinessEntites.QuestionDTO 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>QuestionDTO</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.QuestionText, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.QuestionText, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.QuestionText, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <table class="table" style="width:50%"> 
      @for (int i = 0; i < 3; i++) 
      { 
       @Html.EditorFor(model=>model.Options[i]) 
      } 
     </table> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

這是OptionDTO編輯模板

@using Quiz.BusinessEntites 
@model Quiz.BusinessEntites.OptionDTO 
<tr> 
    <th class="col-md-2"> 
     @Html.DisplayNameFor(m => m.OptionText) 
    </th> 
    <th class="col-md-2"> 
     @Html.DisplayNameFor(m => m.IsCorrect) 
    </th> 
</tr> 
<tr> 
    <td class="col-md-2"> 
     @Html.EditorFor(m => m.OptionText) 
    </td> 
    <td class="col-md-2"> 
     @Html.EditorFor(m => m.IsCorrect) 

    </td> 
</tr> 

從上圖可以看出選項列表爲空。如果你有任何建議,將不勝感激。

+0

作爲一個側面說明,它只是'@ Html.EditorFor( ('EditorFor()'''方法接受'IEnumerable'併爲集合 –

+0

中的每個項目生成正確的html,但是如果我想使用多個editorfor模板我需要使用for循環?就像我的情況一樣,或者我錯過了一些東西。只是所以你知道那些作品。 –

+0

不,你再也不讀了! –

回答

0

的HTTP POST操作方法,該Bind屬性與Include清單告訴模型綁定綁定唯一「身份證」,「QuestionText」和「IsCorrect」從提交的表單數據QuestionDto對象的屬性。所以模型聯編程序不會綁定Options屬性值。

從您的Http post操作方法中刪除Bind屬性。 沒有必要使用綁定屬性,如果您的視圖模型是針對你的觀點,意味着你只需要爲您的視圖屬性(在你的情況下,它看起來像這樣)

public ActionResult Create(QuestionDTO model) 
{ 
    // to do :return something 
} 

如果你想使用非特定視圖模型,但仍希望使用Bind屬性僅指定屬性的子集,只包括那些屬性。在你的情況,你的代碼就會像

public ActionResult Create([Bind(Include="Id,QuestionText",Options"] QuestionDTO model) 
{ 
    // to do :return something 
} 

你也應該editer模板視圖應該是在一個名爲EditorTemplates目錄,而不是EditorTemplate

+0

感謝bro。添加Options to bind(inclu de =「....」)完成了這項工作 –