如何创建多级子模型ASP.Core与EF一个CRUD?

时间:2019-02-01 21:24:28

标签: asp.net entity-framework razor asp.net-core

我正在尝试创建一个可以编辑模型及其所有子模型的CRUD,但是每次父模型最终为空时,如何使用ASP.Core 2.2正确地制作支架式CRUD

//Models

class Book {
    int IdBook {get; set;}
    string Name {getl set;}
    ICollection<Page> PageList {get; set;}
}

class Page {
    int IdPage {get; set;}
    string Name {get; set;}
    ICollection<Line> LineList {get; set;}
}

class Line{
     int IdLine {get;set;}
     string Content {get; set;} 
}

这是我的控制器

//Controller

public async Task<IActionResult> Edit(int? id)
{
    var book = _context.Book
                    .Include(b => b.PageList)
                    .ThenInclude(p => p.LineList)
                    .First();

    return View(book);
}

这就是我想要做的

@model Book

@Model.Name
@for(var indexPage = 0; indexPage < Model.PageList.Count; indexPage++)
{
    @Model.PageList[indexPage].Name
    @for(var indexLine = 0; indexLine < Model.PageList[indexPage].LineList.Count)
    {
        Html.EditorFor(x => x.PageList[indexPage].LineList[indexLine].Content)
    }
}

但是,当我发布表单时,我仅获得Book的属性,而Book.PageListnull,那是什么正确的方法?有没有我会错过任何教程?

更新

问题似乎是类型,控制器收到post参数 (我的代码有些不同,但相同的是本书的示例)

bug

1 个答案:

答案 0 :(得分:1)

您可以在操作请求的控制器上发布动作方法的完整代码吗?

在剃刀视图页面上的代码中,在您遍历PageList的内部循环中,您没有递增onOpenChange。这行不应该

indexLine

@for(var indexLine = 0; indexLine < Model.PageList[indexPage].LineList.Count)

同样,在控制器上,如果Request.Form属性具有整个“假定”有效负载,但模型绑定不起作用,请尝试使用@for(var indexLine = 0; indexLine < Model.PageList[indexPage].LineList.Count, indexLine++)注释Submission参数以清楚地通知ASP .NET从请求的绑定中绑定[FromBody]-像这样

Submission

仔细查看这些小补丁,让我知道您是否还有任何问题