我试图在asp.net核心剃须刀页面中使用[BindProperty]
批注,以便绑定我的一个模型类的Ilist<T>
集合,以便我可以一次编辑其中一些模型,但是它没有完全可以工作,每次在OnPostAsync函数中,集合为空,并且我对数据或其默认值所做的更改都不会回发到服务器,但是当其单一对象[BindProperty]工作正常并且值回发时并且可以更改,我也尝试将一个集合(即list<T>
)包装在一个对象中,但是无论哪种方式都行不通,所以有什么办法可以这样做,或者我应该说对每个对象发送编辑请求该集合并一个接一个地编辑它们(不能在剃须刀的页面上轻松完成,并且需要一些ajax调用)?
答案 0 :(得分:7)
要在IList
和RazorPage
之间绑定PageModel
,则需要使用Product[i].Name
来绑定属性。
这是完整的步骤。
模型
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
PageModel
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>