首页 > 解决方案 > Asp.net 核心剃须刀页面 [BindProperty] 不适用于集合

问题描述

我试图[BindProperty]在 asp.net 核心剃须刀页面中使用注释来绑定Ilist<T>我的一个模型类的集合,这样我就可以一次编辑其中的一些,但它根本不起作用,每次在 OnPostAsync 函数中集合都是空的,并且我对数据所做的更改和默认值都不会回传到服务器,但是当它的单个对象 [BindProperty] 工作正常并且值回传并且可以更改时,我也尝试包装一个集合(即list<T>(需要一些ajax调用)??

标签: data-bindingcollectionsasp.net-core-2.0razor-pages

解决方案


对于 and 之间的绑定,IList您需要使用to 绑定属性。 RazorPagePageModelProduct[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>
    

推荐阅读