具有Html.BeginCollectionItem扩展名的MVC嵌套EditorTemplate始终返回值为“0”或“null”的对象

时间:2016-08-26 20:25:35

标签: asp.net asp.net-mvc asp.net-mvc-4 razorengine

我试图返回一个包含一个或多个子模型的模型,而这些子模型又可以包含一个子模型。第一层成功返回,但是,当我想返回第三层子模型时,我得到该模型的“默认”实例,而没有实际填充的变量。因此,返回的模型包含一个子模型,子模型包含另一个子模型,但最后一个子模型的值设置为'0'和'null'。

我正在使用Html.BeginItemCollection扩展方法,但我不确定我是否在第3层以正确的方式使用它们。如果有人请看看这个并帮助我?

主模型页面(第1层)

@using Website.Models
@model CreateAgendaBindingModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
    <div class="form-horizontal">   
    for (int i = 1; i < 16; i++)
    {
        <div id='CreateVoedingDiv_@i'>
              @Html.EditorFor(x => x.VoedingCollection[i], "CreateVoedingTemplate")
        </div>
    }
}

主要模型类(第1层)

public class CreateAgendaBindingModel
{
    public int Id { get; set; }
    public List<CreateVoedingBindingModel> VoedingCollection { get; set; }
}

子模型页面(第2层)

@using HtmlHelpers.BeginCollectionItem;
@using Website.Models

@model CreateVoedingBindingModel

@using (Html.BeginCollectionItem("VoedingCollection"))
{
    <div class="form-group" id=@customVoedingId>
            @Html.EditorFor(x => x.CustomVoeding[0], "CreateCustomVoedingTemplate")
    </div>
}

子模型类(第2层)

public class CreateVoedingBindingModel
{
    public int Id { get; set; }
    public List<customvoeding> CustomVoeding { get; set; }
}

子模型页面的子模型(第3层)

@using HtmlHelpers.BeginCollectionItem;
@model FoodtrackerModel.customvoeding

@using (Html.BeginCollectionItem(ViewData.TemplateInfo.HtmlFieldPrefix + ".CustomVoeding"))
{
    <div class="form-group">
        @Html.Label("Opmerking (optioneel)", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.customVoedingOpmerking, new { htmlAttributes = new { @class = "form-control" } })                   
        </div>
    </div>
}

子模型类的子模型是与实体框架集成的部分类。

子模型类的子模型(第3层)

public partial class customvoeding
{
    public static List<customvoeding> GetAllCustomvoeding()
    {
        using (foodtrackerEntities1 db = new foodtrackerEntities1())
        {
            db.Configuration.LazyLoadingEnabled = false;
            return db.customvoeding.ToList();
        }
    }
}

因此,为了澄清,返回第1层和第2层并填入所有变量。返回第3层但未填写任何变量。

1 个答案:

答案 0 :(得分:0)

我通过不使用子模型的子模型解决了我的问题。我只是简单地将子模型字段的子模型硬编码为前一层的字段(因此第3层字段成为第2层字段)。恶心,但它解决了我的问题。老实说,我没有理解在快速时间范围内提供的解决方案,因为时间就是金钱,我继续说道。

失望,默认情况下MVC没有此功能。