在 .NET 6 Razor Pages 中发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

问题描述 投票:0回答:1

我正在尝试绑定一个复杂对象,其中包含复杂对象列表,其中也包含自己的复杂对象列表;所以嵌套的对象列表。数据绑定到页面没有错误,我可以看到预先填充的内容。尝试将表单发布到处理程序方法时会出现此问题。

我能够成功发布并绑定父对象(ObjectA)、它的所有数据类型属性,以及它的属性(复杂对象列表)(ObjectB)。但是,我无法绑定 ObjectB 中包含的对象列表 (ObjectC)。

因为我的代码冗长且复杂(并且保密),所以我将提供一个简单的示例来说明我正在尝试的内容。

我的类和处理程序方法:

// Classes
public class ObjectA
{
    public int Id { get; set; }
    public IList<ObjectB> ObjectBList { get; set; }
}

public class ObjectB
{
    public int Id { get; set; }
    public IList<ObjectC> ObjectCList { get; set; }
}

public class ObjectC
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// Handler method
public async Task<IActionResult> OnPostDoSomethingAsync(ObjectA objectA)
{
    // Do Something
}

我的.cshtml伪代码; ClassA是页面模型

我有各种类型的输入字段,但在此示例中我仅使用“隐藏”

<form id="myFormId">
    <input type="hidden" asp-for="@Model.Id" />
    @for (var i; i < @Model.ObjectBList.Count(); i++)
    {
        var objectCList = @Model.ObjectBList[i].ObjectCList.Where(z => z.Id < 4); // I need to perform some filtering logic in multiple places, so create a temp object
        <input type="hidden" asp-for="@Model.ObjectBList[i].Id" name="ObjectBList[@i].Id" />
        @for (var z; z < objectCList.Count(); z++)
        {
            <input type="hidden" asp-for="objectCList[z].Id" name="ObjectBList[@i].ObjectCList[@z].Id" />
    }
</form>

我希望能够通过提交类型按钮(使用标准 Razor 页面表单提交/页面重新加载)以及通过 ajax 提交此表单。我当前的测试是通过 ajax 帖子进行的,类似于以下内容:

$.post('/Page?handler=DoSomething', $(#myFormId).serialize(), function () { alert('success'); });

当我使用上面编写的代码执行 post 操作时,我在有效负载中看到类似于以下内容的内容:

Id: 1
ObjectB[0].Id: 1
ObjectB[0].ObjectC[0].Id: 1
ObjectB[0].ObjectC[1].Id: 2
ObjectB[1].Id: 2
ObjectB[1].ObjectC[0].Id: 1
ObjectB[1].ObjectC[1].Id: 2

此有效负载的结果是我的处理程序被命中,但参数“objectA”为空(大概是因为收到的内容与我预期的对象模型不匹配并且绑定失败)。我的期望是我会收到一个已填充的 ObjectA,其中包括一个 ObjectB 列表,其中包含一个 ObjectC 列表。

需要注意的是,如果我注释掉与绑定ObjectC相关的CSHTML代码,并且只绑定ObjectA和ObjectB,我的有效负载如下所示:

Id: 1
ObjectB[0].Id: 1
ObjectB[1].Id: 2

结果是一切都按预期进行。我的处理程序方法被命中,并且填充了 ObjectA,包括 ObjectBList,其中包含 ObjectB 列表(如预期)。因此,当我尝试在 ObjectC 中添加时,它会破坏绑定并在我的处理程序中产生 null。

我预计我为 ObjectC 命名输入字段的方式出了问题,并且生成的有效负载不正确。对于这种情况的正确语法的任何指导将不胜感激。如果我的方法是正确的,那么我认为我有一个打字错误或类似的问题需要找到(到目前为止尚未发现)。

c# ajax asp.net-core .net-core razor-pages
1个回答
0
投票

<input type="hidden" asp-for="objectCList[z].Id" name="ObjectBList[@i].ObjectCList[@z].Id" />

您可以删除 type="hidden" 来查看是否通过 asp-for="objectCList[z].Id" 设置给它的值,我的测试不是,所以我有一些更改,如下所示, 尝试一下:

 @for (var i = 0; i < @Model.ObjectBList.Count(); i++)
 {
     var objectCList = Model.ObjectBList[@i].ObjectCList.Where(z => z.Id <4).Select(C => C.Id).ToList(); 
     <input type="hidden" asp-for="@Model.ObjectBList[i].Id" name="ObjectBList[@i].Id" />     
     @for (var z = 0; z <Model.ObjectCList.Count(); z++)
     {
         <input type="hidden" value="@objectCList[@z]" name="ObjectBList[@i].ObjectCList[@z].Id" />
     }
 }

结果:

© www.soinside.com 2019 - 2024. All rights reserved.