ASP.NET Core Razor Pages中如何用AddRange忽略空行保存数据
解决方案
1. 核心处理:过滤非空行并清理验证状态
在后端OnPostAsync方法中,先筛选出填写了有效内容的行,同时清理空行对应的验证错误,避免因空行导致整体验证失败:
public async Task<IActionResult> OnPostAsync(IList<InvRow> RowList) { // 根据业务需求定义空行判断逻辑,示例:名称非空且数量、价格大于0 var validRows = RowList.Where(row => !string.IsNullOrWhiteSpace(row.Name) && row.Qty != 0 && row.Price != 0 ).ToList(); // 移除ModelState中空行的验证错误,避免影响整体验证结果 for (int i = 0; i < RowList.Count; i++) { var row = RowList[i]; if (string.IsNullOrWhiteSpace(row.Name) && row.Qty == 0 && row.Price == 0) { ModelState.Remove($"RowList[{i}].Name"); ModelState.Remove($"RowList[{i}].Qty"); ModelState.Remove($"RowList[{i}].Price"); } } if (!ModelState.IsValid) { // 保留用户已输入的内容,返回页面时显示 this.RowList = RowList; return Page(); } _context.InvRows.AddRange(validRows); await _context.SaveChangesAsync(); return RedirectToPage("./Index"); }
2. 可选:调整模型验证规则
如果业务允许部分字段存在特定值(比如数量允许为0,但名称必填),可以修改InvRow模型的验证属性:
public class InvRow { public int Id { get; set; } [Required(ErrorMessage = "名称不能为空")] public string Name { get; set; } // 根据需求调整验证规则,比如允许数量为0则移除Range限制 [Range(0, int.MaxValue, ErrorMessage = "数量不能为负数")] public int Qty { get; set; } [Range(0.01, double.MaxValue, ErrorMessage = "价格必须大于0")] public decimal Price { get; set; } }
3. 可选:前端优化验证提示显示
避免空行显示不必要的验证提示,可在前端动态控制提示元素的显示:
<form method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> @{ int i = 0; } @foreach (var item in Model.RowList) { <div class="row"> <div class="form-group col-4"> <input asp-for="@Model.RowList[i].Name" class="form-control" value="@item.Name" /> @* 仅当行不为空时显示验证提示 *@ @if (!string.IsNullOrWhiteSpace(item.Name) || item.Qty != 0 || item.Price != 0) { <span asp-validation-for="@Model.RowList[i].Name" class="text-danger"></span> } </div> <div class="form-group col-4"> <input asp-for="@Model.RowList[i].Qty" class="form-control" value="@item.Qty" /> @if (!string.IsNullOrWhiteSpace(item.Name) || item.Qty != 0 || item.Price != 0) { <span asp-validation-for="@Model.RowList[i].Qty" class="text-danger"></span> } </div> <div class="form-group col-4"> <input asp-for="@Model.RowList[i].Price" class="form-control" value="@item.Price" /> @if (!string.IsNullOrWhiteSpace(item.Name) || item.Qty != 0 || item.Price != 0) { <span asp-validation-for="@Model.RowList[i].Price" class="text-danger"></span> } </div> </div> @(i++) } <div class="form-group"> <input type="submit" value="Create" class="btn btn-primary" /> <a asp-page="Index">Back to List</a> </div> </form>
关键说明
- 空行判断逻辑可根据实际业务灵活调整,比如仅判断名称非空即可视为有效行。
- 必须清理空行对应的ModelState错误,否则即使过滤了空行,原验证错误仍会导致
ModelState.IsValid返回false。 - 提交失败返回页面时,重新赋值
RowList可保留用户已输入的内容,提升体验。
内容的提问来源于stack exchange,提问作者Fillo
相关产品推荐
相关产品推荐

