【问题标题】:Dynamically checking each KeyValuePair value of a model动态检查模型的每个 KeyValuePair 值
【发布时间】:2010-10-15 12:42:11
【问题描述】:

我有一个这样的视图模型,它是从我的验证器创建的。

public class ViewModel
{
    public KeyValuePair<int, RuleType> Foo { get; set; }
    public KeyValuePair<string, RuleType> Bar { get; set; }
}

我的真实视图模型有 20 多个字段。一旦我的数据经过验证,ViewModel 类型的通用列表就会返回到我的 MVC 视图并处理成报告。但是,出现了一个功能请求,用户希望只看到有错误和警告的模型,不包括有效实体。 RuleType 是一个枚举器。如果密钥对的所有值都是RuleType.Success,则模型有效。

是否可以遍历每个模型并检查 RuleType 而无需手动检查每个属性?我的GetAllModelsWithErrors() 函数将返回无效模型列表。我相信反射可能是一个解决方案,但我不确定它是否是一个好的解决方案。

【问题讨论】:

  • 您可以注册 ViewModel 的所有属性或使用反射。例如,您可以通过每个属性的set mutator 注册它们(这样您最终将获得KeyValuePair 实例的集合,并且您可以验证它们)。

标签: c# model-view-controller viewmodel


【解决方案1】:

试试这个:

    private IEnumerable<ViewModel> GetInvalidModels(ViewModel[] viewModels)
    {
        return 
            from viewModel in viewModels 
            from prop in typeof(ViewModel).GetProperties() 
            let ruleType = ((KeyValuePair<object, RuleType>)prop.GetValue(viewModel, null)).Value 
            where ruleType != RuleType.Success 
            select viewModel;
    }

【讨论】:

  • 当我在结果中使用 ToList() 时,let ruleType 行会引发无效异常。如果我的某些 KeyValuePair 值具有可为空的类型,我应该做一些不同的事情吗?
  • 正如您自己所说,“如果密钥对的所有值都是 RuleType.Success,则模型有效”。因此,我的查询基于您在 KeyValuePairs 中的值始终是 RuleType 类型的假设,该类型是枚举,因此不可为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2015-08-26
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多