应用DataAnnotations(MVC3)

时间:2011-09-20 15:43:13

标签: asp.net-mvc-3 c#-4.0

我使用的是具有完整对象集的API。我不想在mvc3代码中重新创建对象模型只是为了使用DataAnnotations。

有没有办法在包装类中使用此功能?对象有自己的验证规则,我可以重用,但希望使用内置的mvc框架来显示消息。

3 个答案:

答案 0 :(得分:1)

您可以使用this链接中的以下示例中的元数据类,但我猜您必须以编程方式添加MetaDataType属性...

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    [MetadataType(typeof(MovieMetaData))]
    public partial class Movie
    {
    }


    public class MovieMetaData
    {
        [Required]
        public object Title { get; set; }

        [Required]
        [StringLength(5)]
        public object Director { get; set; }


        [DisplayName("Date Released")]
        [Required]
        public object DateReleased { get; set; }
    }

}

答案 1 :(得分:1)

您可以创建一个继承自DataAnnotationsModelMetadataProvider的类,您可以在其中使用对象集,并将项目写为DataAnnotations。一个简短的例子:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    private MyEntities _db = new MyEntities();

    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes, 
        Type containerType, 
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName)
    {
        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        // load object
        var objectSet = _db.ObjectSets.FirstOrDefault(x => x.PropertyName == propertyName);

        // check attributes
        if (objectSet.IsRequired)
            modelMetadata.IsRequired = true;

        return modelMetadata;
    }
}

然后,在Application_Start方法中在Global.asax.cs中注册您的提供者,如下所示:

        ModelMetadataProviders.Current = new MyModelMetadataProvider();

答案 2 :(得分:0)

我从未尝试过这个。您可以在MVC模型中编写所有API类继承的基类。在该基类上实现IValidatableObject并使用现有的验证规则。使用MetadataType,您仍然需要使用需要验证的那些文件重写该类。