如何处理MVC 5

时间:2016-04-25 20:56:35

标签: c# asp.net-mvc asp.net-mvc-5

我正在使用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作为集合。

2 个答案:

答案 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,因此您的模板也应该使用集合而不是单个项目。