【问题标题】:Asp.net core razor pages [BindProperty] doesnt work on collectionsAsp.net 核心剃须刀页面 [BindProperty] 不适用于集合
【发布时间】:2019-01-19 15:35:46
【问题描述】:
我试图在 asp.net 核心剃须刀页面中使用 [BindProperty] 注释以绑定我的一个模型类的 Ilist<T> 集合,以便我可以一次编辑其中的一些,但它根本不起作用,每次在 OnPostAsync 函数中,集合都是空的,我对数据所做的更改和默认值都不会回传到服务器,但是当它的单个对象 [BindProperty] 工作正常并且值回传并且可以更改时,我也尝试将一个集合(即list<T>)包装在一个对象中,但无论哪种方式都不起作用,所以有什么方法可以这样做,或者我应该说为该集合中的每个对象发送一个编辑请求并编辑它们一个(不能在剃须刀页面中轻松完成,需要一些 ajax 调用)??
【问题讨论】:
标签:
data-binding
collections
asp.net-core-2.0
razor-pages
【解决方案1】:
要在RazorPage 和PageModel 之间绑定IList,您需要使用Product[i].Name 绑定属性。
这里是完整的步骤。
-
型号
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
-
页面模型
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;
}
}
-
查看
<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>