我正在使用MVC 5,我希望有一个编辑页面,允许从列表中选择项目,并为每个项目选择选项。所以我有一个这样的模型:
public class TemplateEdit
{
public Guid TemplateId {get; set;}
public string TemplateName {get; set;}
public ICollection<MyOption> Options {get; set;}
}
public class MyOption
{
public Guid MyOptionId {get; set;}
public Guid TemplateId {get; set;}
public string OptionName {get; set;}
public bool Selected {get; set;}
public ICollection<SubOption> SubOptions {get; set;}
}
public class SubOption
{
public Guid SubOptionId {get; set;}
public Guid MyOptionId {get; set;}
public string SubOptionName {get; set;}
public bool Selected {get; set;}
}
我们假设我有LINQ来获取此数据。现在我要显示它。我希望使用Editor
模板。
在template-edit.cshtml
视图中,我有类似的内容:
@model TemplateEdit
<div class="form-group col-md-12">
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.TemplateId)
</div>
<div class="form-group col-md-12">
@Html.LabelForRequired(m => m.TemplateName, new {@class = "control-label"})
@Html.TextBoxFor(m => m.TemplateName, new {@class = "form-control"})
</div>
<div class="col-md-12" style="overflow: auto; height: 350px;">
@Html.Label("Options Selected")
<div>
@Html.EditorFor(m => m.Options);
</div>
</div>
在MyOption.cshtml
EditorTemplate:
@model MyOption
<div class="optionable">
@Html.HiddenFor(m => m.MyOptionId)
@Html.HiddenFor(m => m.TemplateId)
<div class="row">
<div class="col-md-2">
@Html.CheckBoxFor(model => model.Selected, new { @class = "form-control optionToggle" })
</div>
<div class="col-md-8">
@Html.DisplayFor(model => model.OptionName, new { @class = "form-control" } )
</div>
</div>
<div class="row options">
@Html.EditorFor(m => m.SubOptions);
</div>
</div>
在我的SubOption.cshtml
EditorTemplate:
@model SubOption
<div class="optionable">
@Html.HiddenFor(m => m.SubOptionId)
@Html.HiddenFor(m => m.MyOptionId)
<div class="row">
<div class="col-md-2">
@Html.CheckBoxFor(model => model.Selected, new { @class = "form-control optionToggle" })
</div>
<div class="col-md-8">
@Html.DisplayFor(model => model.SubOptionName, new { @class = "form-control" } )
</div>
</div>
</div>
我遇到的问题是,当我返回模型时,我没有收到SubOption数据。
注意:
我找到的所有示例都是针对MVC3或更早版本的,并使用索引方法来遍历集合。我会尝试,除了我正在使用ICollection作为集合。
答案 0 :(得分:2)
检查控制器中的操作。如果您将viewmodel作为参数传递,则应包含您的&#39; SubOptions&#39;集合。
即
[HttpPost]
public ActionResult SaveData(MyViewModel model)
{
}
答案 1 :(得分:-1)
将SubOption.cshtml
更改为如下所示:
@model System.Collections.Generic.IEnumerable<SubOption>
@foreach(var option in Model)
{
<div class="optionable">
@Html.HiddenFor(m => option.SubOptionId)
...
</div>
}
您正在将一个集合传递给EditorFor,因此您的模板也应该使用集合而不是单个项目。