ASP.NET MVC控制器中统计模型必填字段已填充数量的方法
ASP.NET MVC统计模型必填字段已填充数量的正确实现
你的现有代码存在几个问题,没法准确统计必填字段的已填充数量:
- 没有筛选带有
[Required]特性的属性,会把所有属性(比如不带[Required]的Id)都纳入统计 - 值类型(比如示例里的
Citizen_Country_Id是int)默认值是0而非null,你的代码判断c == null会漏掉这类值类型的未填充情况 - 你的代码统计的是未填充的数量,而你需要的是已填充的数量,逻辑方向反了
正确实现思路
要准确统计,需要分两步:
- 先筛选出模型中带有
[Required]特性的属性 - 针对不同数据类型(值类型/引用类型),判断属性值是否属于“已填充”状态:
- 引用类型(如
string):判断不为null,如果需要排除空字符串,再额外判断!string.IsNullOrEmpty - 值类型(如
int):判断不等于该类型的默认值(比如int的默认值是0) - 可空值类型(如
int?):判断有值且不等于底层类型的默认值
- 引用类型(如
代码实现
可以写一个通用方法来处理:
public int GetFilledRequiredFieldCount(object model) { // 筛选出所有带[Required]特性的属性 var requiredProperties = model.GetType().GetProperties() .Where(prop => Attribute.IsDefined(prop, typeof(RequiredAttribute))); int filledCount = 0; foreach (var prop in requiredProperties) { var value = prop.GetValue(model); var propType = prop.PropertyType; // 处理值类型 if (propType.IsValueType) { // 非可空值类型 var underlyingType = Nullable.GetUnderlyingType(propType); if (underlyingType == null) { var defaultValue = Activator.CreateInstance(propType); if (!value.Equals(defaultValue)) { filledCount++; } } // 可空值类型 else { if (value != null && !value.Equals(Activator.CreateInstance(underlyingType))) { filledCount++; } } } // 处理引用类型 else { if (propType == typeof(string)) { // 若认为空字符串不算填充,用!string.IsNullOrEmpty;若允许空字符串,只判断value != null if (!string.IsNullOrEmpty((string)value)) { filledCount++; } } else { if (value != null) { filledCount++; } } } } return filledCount; }
在控制器中使用
// 假设customer是从数据库获取的实体对象 int filledRequiredCount = GetFilledRequiredFieldCount(customer); // 将计数传递到视图,比如用ViewBag或ViewModel ViewBag.FilledRequiredFields = filledRequiredCount;
注意事项
- 对于值类型的必填字段,比如
int,如果业务中0是合法值(比如某个国家的Id就是0),你需要调整判断逻辑,比如和业务上的无效值对比,而不是用类型默认值 - 若你的
[Required]配合了[MinLength(1)]等特性,判断字符串时可以直接用!string.IsNullOrEmpty,否则根据业务需求决定是否允许空字符串作为填充值
内容的提问来源于stack exchange,提问作者Dev Beginner
相关产品推荐
相关产品推荐

