如何在Razor Page的OnPostSave中获取textarea的列表值?
问题解决方案
问题原因
使用foreach遍历Numbers列表时,asp-for="@item.val"生成的HTML元素name属性不包含集合索引,ASP.NET Core模型绑定器无法识别这些字段属于Numbers集合,因此Post请求时无法将值绑定到Numbers,导致集合计数为0。
修复方案
将前端的foreach循环改为for循环,通过索引访问集合元素,让asp-for生成符合集合绑定规则的name属性(格式为Numbers[索引].val)。
修改后的前端代码:
@for (int i = 0; i < Model.Numbers.Count; i++) { <textarea asp-for="Numbers[i].val" style="width:100%">@Model.Numbers[i].val</textarea> }
后台补充(可选,避免空引用):
确保Numbers在OnGet方法中初始化,防止页面加载时出现空引用异常:
public void OnGet() { Numbers ??= new List<number>(); // 示例:初始化测试数据 if (Numbers.Count == 0) { Numbers.Add(new number { val = 1 }); Numbers.Add(new number { val = 2 }); } }
原理说明
ASP.NET Core模型绑定器识别集合的前提是表单字段的name属性包含「集合名称+索引」的结构(如Numbers[0].val)。for循环可以通过索引正确生成这种格式的name,而foreach遍历的是单个独立元素,无法提供集合上下文的索引信息,因此生成的name无法被绑定器识别为集合的一部分。
内容的提问来源于stack exchange,提问作者Mark C
相关产品推荐
相关产品推荐

