代码之家  ›  专栏  ›  技术社区  ›  Felipe Lima

动态生成模型中的ASP.NET MVC 2数据注释

  •  8
  • Felipe Lima  · 技术社区  · 14 年前

    我正在创建一个ASP.NET MVC 2应用程序,根据用户输入动态生成视图模型。简单地说,用户可以选择要在其视图中查看哪些字段。

    由于模板化的助手严重依赖于模型属性和属性(数据注释),所以我需要在运行时向视图模型添加属性。没必要说这不是一个简单的任务。

    所以,你们建议我在这种情况下做什么?我不能静态地添加属性,所以我应该继续尝试动态地添加它们吗,即使这需要大量的工作,还是应该尝试使用不同的方法?

    事先谢谢!

    费利佩

    3 回复  |  直到 14 年前
        1
  •  3
  •   Eilon    14 年前

    自定义模型绑定器只对绑定部分有帮助。它对模板化的助手或ASP.NET MVC的其他功能没有帮助。

    我建议你写个习惯 元数据 提供程序,而不是从继承 ModelMetadataProvider 并使用在global.asax中注册您的提供商 ModelMetadataProviders .自定义元数据提供程序可以从任意位置获取其元数据:clr属性、XML文件、数据库或随机数生成器。当然,内置数据注释提供程序使用clr属性。

    您可能需要查看内置数据注释元数据提供程序的源代码,以查看如何实现提供程序的示例。您可以从下载ASP.NET MVC 2 RC 2源代码 the CodePlex site . MVC期货项目中也可能有一个实现,但我不确定。

        2
  •  0
  •   Donald Byrd    14 年前

    似乎您需要一个动态应用验证的自定义视图模型绑定器。

        3
  •  0
  •   mtmk    14 年前

    听起来像是杀戮过度(如果我理解正确的话),那就是在飞行中创建模型。您没有使用模型的主要优点;编译时检查。

    我会尝试使用特定于任务的对象(例如,一个拥有userformFields类列表的userformFields类等),而不是动态创建它们。

    编辑: 我的建议是 使用基于属性的验证,并在设计模型时考虑验证。下面这样的设计可以更好地解释我的观点:

    interface IUserValidation
    {
        bool IsValid();
    }
    
    class RequiredUserValidation : IUserValidation
    {
        public bool IsValid()
        {
            // ....
        }
    }
    
    class UserFormField
    {
        List<IUserValidation> _validations;
    
        public IEnumerable<ValidationResult> Validate()
        {
           // ...
        }
    }