复杂型号模型不会通过列表属性

时间:2017-08-24 18:28:29

标签: asp.net-mvc razor asp.net-mvc-5 mvc-editor-templates

嗨,大家好我的mvc应用程序有问题。它是一个简单的测验应用程序,我坚持为问题模型创建创建视图。

我有问题和选项模型以及适当的视图模型(在我的例子中,它们是QustionDTO和OptionDTO),我想使用选项列表为问题制作cshtml创建视图。like this但是当我提交表单时,我的选项列表为null。 这是我的问题和选项模型

 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; }
}

这是我的视图,编辑模板位于“〜/ views / shared / 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>

从上图中你可以看到选项列表为空。如果您有任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:0)

在您的http post action方法中,带有Bind列表的Include属性告诉模型绑定器仅绑定&#34; Id&#34;,&#34; QuestionText&#34;和&#34; IsCorrect&#34;已发布表单数据中QuestionDto对象的属性。因此模型绑定器不会绑定Options属性值。

从Http post action方法中删除Bind属性。 如果您的视图模型特定于您的视图,则无需使用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