表单 POST 对于 MVC Model Binder 来说是否太大

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

此问题出现在.net core 3.1 MVC网站中。

我无法将 POST 绑定到控制器操作(参数始终为空)。数据是从数据库加载的,并且是一个大型的递归结构。 如果我删除数据库中的几百行 JSON(大约 2500 行),它将绑定正常。

GET 显示完美。

即使我将 Action 方法参数从 ViewModel 更改为 IFormCollection,它仍然显示为 null。这里是否有一些我没有意识到的限制? 如果大小是问题,是否有更好的方法来发布数据?

家长视图

<form id="frmAdditionalCodes" name="frmAdditionalCodes" method="post">
    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Code)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.FullName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Description)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>

            <tr>

                <td style="width:50px">
                    @Html.DisplayFor(modelItem => Model.Code)
                    <input asp-for="@Model.Code" class="form-control" style="display:none" />
                </td>
                <td style="width:50px">
                    @Html.DisplayFor(modelItem => Model.FullName)
                    <input asp-for="@Model.FullName" class="form-control" style="display:none" />
                </td>
                <td style="width:50px">
                    @Html.DisplayFor(modelItem => Model.Description)
                    <input asp-for="@Model.Description" class="form-control" style="display:none" />
                </td>
                <td style="width:20px">
                    <span>
                        <i id="addTagItem" class="fas fa-folder-plus" title="Add child item"></i>
                    </span>

                </td>
                <td>
                    <partial name="~/Views/PartialViews/_SectionsAndTags.cshtml" model="@Model.Entities" view-data="ViewData" />
                </td>
                <td>
                </td>

            </tr>

        </tbody>
    </table>
</form>

子视图

<table class="partial_table">
    <thead>
        <tr>

            <th>
                @Html.DisplayNameFor(model => model.Code)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FullName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th colspan="2">
                @Html.DisplayNameFor(model => model.Entities)
            </th>
        </tr>
    </thead>
    <tbody>
        @{ List<CdsDeclarationSectionAndTagItemViewModel> list = Model.ToList();
            for (int i = 0; i < list.Count(); i++)
            {
                    <tr>
                        @{
                            string elementNameCode = $"{list[i].Prefix}Code";
                            string elementNameFullName = $"{list[i].Prefix}FullName";
                            string elementNameDescription = $"{list[i].Prefix}Description";
                            string elementNameIsDeleted = $"{list[i].Prefix}IsDeleted";
                        }
                        <td>
                            <span>@list[i].Code</span>
                            <input asp-for="@list[i].Code" name="@elementNameCode" class="form-control" style="display: none" />
                        </td>
                        <td>
                            <span>@list[i].FullName</span>
                            <input asp-for="@list[i].FullName" class="form-control" name="@elementNameFullName" style="display: none" />
                        </td>
                        <td>
                            <span>@list[i].Description</span>
                            <input asp-for="@list[i].Description" class="form-control" name="@elementNameDescription" style="display: none" />
                        </td>
                        <td>
                            @if (list[i].Entities?.Length > 0)
                            {<img id="collapseItem" state="expanded" width="20" height="20" src="~/images/minus_PNG24.png" />
                            }

                            <span>
                                <i id="editTagItem" class="fas fa-pencil-alt" title="Edit item"></i>
                                <i id="deleteTagItem" class="far fa-trash-alt" title="Delete item"></i>
                                <i id="addTagItem" class="fas fa-folder-plus" title="Add child item"></i>
                                <i id="updateTagItem" class="far fa-save" title="Save changes" style="display: none"></i>
                                <i id="cancelTagItem" class="fas fa-undo-alt" title="Undo changes" style="display: none"></i>
                            </span>

                        </td>
                        <td>
                            @if (list[i].Entities?.Length > 0)
                            {
                                <partial name="~/Views/PartialViews/_SectionsAndTags.cshtml" model="@list[i].Entities" />
                            }
                        </td>
                        <td>
                            <input type="hidden" value="false" name="@elementNameIsDeleted" />

                        </td>

                    </tr>
            }
        }
    </tbody>
</table>

视图模型

public class CdsDeclarationSectionAndTagViewModel
{
    public string Code { get; set; }

    public string FullName { get; set; }

    public string Description { get; set; }

    public CdsDeclarationSectionAndTagItemViewModel[] Entities { get; set; }
}

public class CdsDeclarationSectionAndTagItemViewModel
{
    public string Code { get; set; }
    public string FullName { get; set; }
    public string Description { get; set; }

    public CdsDeclarationSectionAndTagItemViewModel[] Entities { get; set; }

    public string Prefix { get; set; }

    public bool IsDeleted { get; set; }
}

控制器 这里 vm 为空,除非我删除一些数据

[HttpPost]
public async Task<IActionResult> CdsDeclarationSectionAndTag(CdsDeclarationSectionAndTagViewModel vm)
        {
        }

如果我像这样改变它,fc也为空

[HttpPost]
public async Task<IActionResult> CdsDeclarationSectionAndTag(IFormCollection fc)
        {
        }

发布的表单数据如下所示(最终可能有 4 或 5 个递归级别)

代码:42A 全名: 描述:声明 实体[0].代码:023 实体[0].FullName:接受(税点)日期时间 实体[0].描述:接受(税点)日期时间 实体[0].IsDeleted: false 实体[1].代码:D026 实体[1].全名:LRN 实体[1].描述:LRN 实体[1].IsDeleted: false 实体[2].代码:D013 实体[2].FullName:声明类型 实体[2].描述:声明类型 实体[2].IsDeleted: false 实体[3].代码:109 实体[3].FullName:发票总计 实体[3].描述:发票总计 实体[3].IsDeleted: false 实体[4].代码:504 Entities[4].FullName:具体情况指示器 实体[4].描述:具体情况指标 实体[4].IsDeleted: false 实体[5].代码:131 实体[5].FullName:总质量 实体[5].描述:总质量 实体[5].IsDeleted: false 实体[6].代码:146 实体[6].FullName:包总数 实体[6].描述:总包数 实体[6].IsDeleted: false 实体[7].代码:61B 实体[7].FullName:身份验证 实体[7].描述:身份验证 实体[7].实体[0].代码:104 实体[7].实体[0].FullName:签名/身份验证 实体[7].实体[0].描述:签名/身份验证 实体[7].实体[0].IsDeleted:假 实体[7].IsDeleted: false 实体[8].代码:02A 实体[8].FullName:延期付款 实体[8].描述:延期付款 实体[8].实体[0].代码:D031 Entities[8].Entities[0].FullName:延期类别代码 Entities[8].Entities[0].Description:类别代码 实体[8].实体[0].IsDeleted:假 实体[8].实体[1].代码:D005 Entities[8].Entities[1].FullName:延期 ID 实体[8].实体[1].描述:ID 实体[8].Entities[1].IsDeleted:假 实体[8].实体[2].代码:D006 Entities[8].Entities[2].FullName:延期类型 实体[8].实体[2].描述:类型 实体[8].实体[2].IsDeleted:假 实体[8].IsDeleted: false 实体[9].代码:03A 实体[9].FullName:附加信息 实体[9].描述:附加信息 实体[9].实体[0].代码:226 Entities[9].Entities[0].FullName:附加信息声明代码 Entities[9].Entities[0].Description:语句代码 实体[9].实体[0].IsDeleted:假 ....

c# asp.net-mvc .net-core model-binding
2个回答
11
投票

我在this线程上找到了答案。 事实证明,默认情况下,您可以提交的表单值的限制为 1024。

我在 Startup.cs 中使用以下代码更改限制,问题消失了,现在可以成功绑定

        services.Configure<FormOptions>(options =>
        {
            options.ValueCountLimit = int.MaxValue;
        });

0
投票

它对我有用!

在 Asp.Core 8.0 中

services.Configure<FormOptions>(options =>
    {
        options.ValueCountLimit = int.MaxValue;
    });
© www.soinside.com 2019 - 2024. All rights reserved.