Asp.net 核心剃须刀页面 [BindProperty] 不适用于集合

Asp.net core razor pages [BindProperty] doesnt work on collections

我正在尝试在 asp.net 核心剃须刀页面中使用 [BindProperty] 注释,以便绑定我的一个模型 类 的 Ilist<T> 集合,这样我就可以编辑一些它们一次,但它根本不起作用,每次在 OnPostAsync 函数中集合都是空的,我对数据所做的更改和它的默认值都不会 post 返回服务器,但是当它是单个对象 [BindProperty] 工作正常并且值 post 返回并且可以更改,我也尝试在对象中包装一个集合(即 list<T>)但是它没有任何方式工作,所以有什么办法为此,或者我应该说为该集合中的每个对象发送一个编辑请求并一个一个地编辑它们(这不能在 razor 页面中轻松完成并且需要一些 ajax 调用)??

要在 RazorPagePageModel 之间绑定 IList,您需要使用 Product[i].Name 绑定 属性。

这里是完整的步骤。

  1. 型号

     public class Product
     {
        public int Id { get; set; }
        public string Name { get; set; }
     }
    
  2. 页面模型

    public class IndexModel : PageModel
    {
        private readonly CoreRazor.Data.ApplicationDbContext _context;
    
        public IndexModel(CoreRazor.Data.ApplicationDbContext context)
        {
           _context = context;
        }
    
        [BindProperty] 
        public IList<Data.Product> Product { get; set; }
    
        public async Task OnGetAsync()
        {
            Product = await _context.Product.ToListAsync();
        }
    
        public async Task OnPostAsync()
        {
            var product = Product;
        }
    }
    
  3. 查看

    <form method="post">
        <table class="table">
            <thead>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.Product[0].Name)
                    </th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                @for (int i = 0; i < Model.Product.Count(); i++)
                {
                    <tr>
                        <td>
                            <input hidden asp-for="Product[i].Id" class="form-control"/>
                            <input asp-for="Product[i].Name" class="form-control" />
                        </td>
                        <td>
                            <a asp-page="./Edit" asp-route-id="@Model.Product[i].Id">Edit</a> |
                            <a asp-page="./Details" asp-route-id="@Model.Product[i].Id">Details</a> |
                            <a asp-page="./Delete" asp-route-id="@Model.Product[i].Id">Delete</a>
                        </td>
                    </tr>
                }
            </tbody>
        </table>
        <div class="form-group">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    
    </form>