如何通过索引和键名遍历FormCollection以获取对应值
遍历FormCollection实现方案
问题根因
FormCollection是一维键值集合,你所见的form[0][keyA]是完整的字符串键名,并非二维数组结构,直接使用数字作为第一维索引会触发字符串转int的类型错误。
可行实现方案
方案1:正则分组遍历(推荐)
通过正则提取键中的序号和字段名,按序号分组后遍历取值,兼容性更强:
using System.Linq; using System.Text.RegularExpressions; // 匹配键结构,提取序号和字段名 var keyRegex = new Regex(@"form\[(\d+)\]\[(\w+)\]"); // 按序号分组所有有效键值对 var formItemGroups = form.AllKeys .Select(key => { var matchResult = keyRegex.Match(key); if (!matchResult.Success) return null; return new { Index = int.Parse(matchResult.Groups[1].Value), FieldName = matchResult.Groups[2].Value, FieldValue = form[key] }; }) .Where(item => item != null) .GroupBy(item => item.Index) .OrderBy(group => group.Key); // 遍历每个分组对应单组表单数据 foreach (var itemGroup in formItemGroups) { var keyA = itemGroup.FirstOrDefault(f => f.FieldName == "keyA")?.FieldValue; var keyB = itemGroup.FirstOrDefault(f => f.FieldName == "keyB")?.FieldValue; var keyC = itemGroup.FirstOrDefault(f => f.FieldName == "keyC")?.FieldValue; // 此处编写业务处理逻辑 }
方案2:直接拼接键名遍历
无需正则,直接按序号拼接完整键名取值,逻辑更简单:
// 先计算表单组最大序号 int maxFormIndex = -1; foreach (var key in form.AllKeys) { if (key.StartsWith("form[")) { var indexEndPos = key.IndexOf("]", StringComparison.Ordinal); if (indexEndPos > 5 && int.TryParse(key.Substring(5, indexEndPos - 5), out int currentIndex)) { maxFormIndex = currentIndex > maxFormIndex ? currentIndex : maxFormIndex; } } } // 循环拼接键名取值 for (int i = 0; i <= maxFormIndex; i++) { var keyA = form[$"form[{i}][keyA]"]; var keyB = form[$"form[{i}][keyB]"]; var keyC = form[$"form[{i}][keyC]"]; // 此处编写业务处理逻辑 }
注意事项
- 若实际键名前缀不是
form,可自行修改匹配规则或拼接规则 - 取值后建议增加空值判断,避免部分字段未提交导致的空引用异常
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

