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

时间:2010-02-13 02:12:26

标签: asp.net-mvc-2 data-annotations html-helper

我正在创建一个asp.net mvc 2应用程序,根据用户输入动态生成我的视图模型。简而言之,用户可以在他的视图中选择他想要查看的字段。

由于模板化助手很大程度上依赖于模型属性和属性(数据注释),因此我需要以某种方式在运行时将属性添加到视图模型中。不必说这不是一项简单的任务。

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

提前致谢!

菲利普

3 个答案:

答案 0 :(得分:3)

自定义模型绑定器只会帮助您处理绑定部分。它无助于模板化助手或ASP.NET MVC的其他功能。

我建议您继续编写自定义元数据提供程序,方法是继承ModelMetadataProvider并使用ModelMetadataProviders在global.asax中注册您的提供程序。自定义元数据提供程序可以从任何需要的位置获取其元数据:CLR属性,XML文件,数据库或随机数生成器。内置的Data Annotations提供程序当然使用CLR属性。

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

答案 1 :(得分:0)

听起来有点矫枉过正(如果我理解的话) - 这就是在飞行中创建模型。你没有使用模型的主要好处;编制时间检查。

我尝试使用特定于该任务的对象(例如,具有List of UserFormFields类的UserForm类等等),而不是动态创建它们。

修改:我建议使用基于属性的验证并在设计模型时考虑验证。如下设计可以更好地解释我的观点:

interface IUserValidation
{
    bool IsValid();
}

class RequiredUserValidation : IUserValidation
{
    public bool IsValid()
    {
        // ....
    }
}

class UserFormField
{
    List<IUserValidation> _validations;

    public IEnumerable<ValidationResult> Validate()
    {
       // ...
    }
}

答案 2 :(得分:0)

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