Применение аннотаций данных (MVC3) - PullRequest
0 голосов
/ 20 сентября 2011

Я использую API с полным набором объектов.Я не хочу пересоздавать объектную модель в коде mvc3 только для того, чтобы использовать DataAnnotations.

Есть ли способ использовать эту функцию без использования класса-оболочки?У объектов есть свои собственные правила проверки, которые я могу использовать повторно, но хочу использовать встроенную среду mvc для отображения сообщений обратно.

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Вы можете создать класс, который наследуется от 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;
    }
}

Затем зарегистрируйте своего провайдера в Global.asax.cs в методе Application_Start следующим образом:

        ModelMetadataProviders.Current = new MyModelMetadataProvider();
1 голос
/ 20 сентября 2011

Вы можете использовать класс метаданных, как в следующем примере из этой ссылки, хотя я полагаю, что вам придется добавлять атрибут 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; }
    }

}
0 голосов
/ 20 сентября 2011

Я никогда не пробовал это.Вы можете написать базовый класс в модели MVC, который наследуют все классы API.Реализуйте IValidatableObject в этом базовом классе и используйте существующие правила проверки.Используя MetadataType, вам все равно придется переписать класс с теми полями, по которым вам требуется проверка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...