c# - Controller 发布请求中的 asp.net core 绑定(bind) null( View 中包含内部元素列表的列表)

标签 c# asp.net-core model-view-controller razor

我有一个包含项目列表的 View ,这些项目的属性中有一个项目列表(在 View asp.net core 中)。

我使用通用列表来包含我在 View 中使用的通用属性。

ViewModel 如下:

public class AgaqEleViewModel
{        
    public int CodEle { get; set; }

    public int AbrEle { get; set; }

    public string Valor { get; set; }

    ...
}

public class AgaqViewModel
{
    [Required(ErrorMessageResourceType = typeof(AguasResx.DataAnnotations), ErrorMessageResourceName = nameof(AguasResx.DataAnnotations.Required))]
    public int Hoja { get; set; } // Key Id compossed
    
    [Required(ErrorMessageResourceType = typeof(AguasResx.DataAnnotations), ErrorMessageResourceName = nameof(AguasResx.DataAnnotations.Required))]
    public DateTime FechaTomaAq { get; set; }
    
    public float? ProfmuestraM { get; set; }

    ...


    // List test
    public List<AgaqEleViewModel> AgaqEle { get; set; }


    ...
            
}

public class GenericListViewModel<T>
{

    public RespViewModel Resp { get; set; }

    public List<T> ItemsList { get; set; }


    public GenericListViewModel()
    {

    }

    public GenericListViewModel(RespViewModel resp, List<T> genericList)
    {
        Resp = resp;
        ItemsList = genericList;
    }

}

我的Razor View 是这样的:

@model GenericListViewModel<AgaqViewModel>

@{
// get max number of columns of different elements 
int numColElements = Model.ItemsList.Select(s => s.AgaqEle.Count).Max();
}


<form asp-action="AgaqLoaded" method="post" id="agaqExcelForm">

    @if(Model.Resp.XXX)
    {
        ...
    }
    
    <table class="table table-bordered table-sm table-striped">
        <thead>
            <tr>
                @* header columns *@
                <th title="@Literals.Hoja">@Literals.Hoja</th>
                ...

                @* create elements columns header´s *@
                @for(int i = 0; i < numColElements; i++)
                {
                    <th>@Literals.Element</th>
                }
                ...


        <tbody>
            // iterate each item in Model list
            @for (var i = 0; i < Model.ItemsList.Count(); i++)
            {               
                <tr>                    
                    <td class="">
                        <input asp-for="@Model.ItemsList[i].Hoja" type="hidden" />
                        @Model.ItemsList[i].Hoja
                    </td>
                    <td>
                        <input asp-for="@Model.ItemsList[i].FechaTomaAq" type="hidden" />
                        @Model.ItemsList[i].FechaTomaAq
                    </td>
                    ...

                    // iterate each list elements in each item in Model list
                    @for(int j = 0; j < numColElements; j++)
                        {
                            <td>                                
                                <input asp-for="@Model.ItemsList[i].AgaqEle[j].CodEle" type="hidden" />
                                <input asp-for="@Model.ItemsList[i].AgaqEle[j].AbrEle" type="hidden" />
                                <input asp-for="@Model.ItemsList[i].AgaqEle[j].Valor" type="hidden" />
                                ...
                                @elemAgaq.AbrEle: @elemAgaq.Valor
                            </td>                           
                        }
            }
...
<tfoot>
<button id="btnLoad" type="submit" class="btn btn-sm btn-primary"><i class="fa fa-upload"></i>&nbsp;@AguasLiterals.LoadData</button>
    ...
</form>

我的 Controller 是这样的:

[HttpPost("{controller}/{action}/")]
public async Task<IActionResult> AgaqLoaded(GenericListViewModel<AgaqViewModel> listToLoad)
{   
    // save 
    foreach (AgaqViewModel agaqEx in listToLoad.ItemsList)
    {
        AgaqDto saveAgaq = null;
        AgaqDto agaq = _mapper.Map<AgaqDto>(agaqEx);
            
        // save Agaq
        saveAgaq = await _service.SetAgaqAsync(agaq);
        ...

生成的 HTML 代码是:

<td>
    <input type="hidden" data-val="true" data-val-range="El valor ..." data-val-range-max="9999" data-val-range-min="1" data-val-required="Este campo es obligatorio." id="ItemsList_0__Hoja" name="ItemsList[0].Hoja" value="1921">
    1921
</td>
<td>
    <input type="hidden" data-val="true" data-val-required="Este campo es obligatorio." id="ItemsList_0__FechaTomaAq" name="ItemsList[0].FechaTomaAq" value="20/07/2021 0:00:00">
    20/07/2021 0:00:00 
</td>


<td>
    <input type="hidden" data-val="true" data-val-required="The CodEle field is required." id="ItemsList_0__AgaqEle_0__CodEle" name="ItemsList[0].AgaqEle[0].CodEle" value="3">
    <input type="hidden" id="ItemsList_0__AgaqEle_0__AbrEle" name="ItemsList[0].AgaqEle[0].AbrEle" value="Na">
    <input type="hidden" id="ItemsList_0__AgaqEle_0__Valor" name="ItemsList[0].AgaqEle[0].Valor" value="48">
    ...
    Na: 48
</td>
<td>
    <input type="hidden" data-val="true" data-val-required="The CodEle field is required." id="ItemsList_0__AgaqEle_1__CodEle" name="ItemsList[0].AgaqEle[1].CodEle" value="3">
    <input type="hidden" id="ItemsList_0__AgaqEle_1__AbrEle" name="ItemsList[0].AgaqEle[1].AbrEle" value="Ca">
    <input type="hidden" id="ItemsList_0__AgaqEle_1__Valor" name="ItemsList[0].AgaqEle[1].Valor" value="16">
    ...
    Ca: 16
</td>

对象正确到达 View ,并且生成的 HMTL 显然是正确的。 (其余项目/元素具有正确的编号:ItemsList_1__AgaqEle_0__CodEle、ItemsList_1__AgaqEle_0__AbrEle ... ItemsList_7__AgaqEle_0__CodEle ...)

当我在 View 中注释掉列表中每个项目内的元素部分(第二个循环,asp-for 隐藏属性)时,我得到了正确的结果。

enter image description here

但是,如果我不注释这些元素,尽管 HTML 显然是正确的,但是 post 请求调用将到达 null,而没有任何项目或元素。

enter image description here

我有几个可以正常工作的复杂元素的“简单”列表,但是这个列表由带有元素列表的项目组成,我无法绑定(bind)它。

我做错了什么?

我尝试删除通用 View 模型并将其保留为项目列表,我尝试使用 list[i][j] 或 list[i].[j] 以及我能想到的所有内容,但没有任何效果? 有什么想法吗?谢谢。

最佳答案

最后,问题不在于属性的绑定(bind),而在于由于信息量太大,信息没有到达(因为它是一个包含以下内容的项目列表)每个项目的元素列表)。

绑定(bind)的输入参数只是到达 null,而不是给出错误信息。

为了解决这个问题,我们在 startup.csConfigureServices 部分添加了:

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

我希望它对其他人有帮助。

关于c# - Controller 发布请求中的 asp.net core 绑定(bind) null( View 中包含内部元素列表的列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71922725/

相关文章:

c# - 为什么 volatile 还不够?

c# - 可重入代码和局部变量

c# - 如何使用 javascript 将 blob 图像从 html 页面上传到 C# 代码

azure - MSDeploy vs WebDeploy vs Publish-AzureWebsiteProject vs dnu 发布

c# - 无法访问 ASP.NET Core C# 项目中的嵌入资源?

c# - 无法在 Visual Studio Build Framework 中选择 .NET Core 2.2

spring - 无法在tomcat上部署spring项目

c# - 列为复选框并使用转换器时的无效操作异常

rest - 如何保护来自 Postman 等第三方工具的 Web API 请求调用?

c++ - 如何在 QModelViews 中结合模态对话框编辑器和就地小部件编辑器?