嗨,大家好我的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>
从上图中你可以看到选项列表为空。如果您有任何建议,将不胜感激。
答案 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