Общие аннотации данных в ASP.Net MVC2 - PullRequest
2 голосов
/ 21 мая 2010

Привет, у меня есть то, что должно быть простым вопросом. У меня есть набор проверок, которые используют System.CompontentModel.DataAnnotations. У меня есть некоторые проверки, которые характерны для определенных моделей представлений, поэтому мне удобно иметь код проверки в том же файле, что и мои модели (как в файле AccountModels.cs по умолчанию, который поставляется с MVC2). Но у меня есть некоторые общие проверки, которые также применимы к нескольким моделям (например, действительный формат адреса электронной почты). Когда я вырезал / вставил эту проверку во вторую модель, которая в ней нуждается, конечно, я получаю ошибку дублирующегося определения, потому что они находятся в одном пространстве имен (projectName.Models). Поэтому я подумал об удалении общих проверок для отдельного класса в пространстве имен, ожидая, что все мои модели представлений смогут получить доступ к проверкам оттуда. Неожиданно проверки больше не доступны. Я проверил, что они все еще находятся в одном пространстве имен, и все они общедоступны. Я не ожидал, что мне понадобится какая-то конкретная ссылка на них (попытался добавить оператор using для того же пространства имен, но это не решило проблему, и через диалог добавления ссылок проект не может ссылаться на себя (делает смысл).

Итак, есть ли идеи, почему публичные проверки, которые просто были перемещены в другой файл в том же пространстве имен, не видны моим моделям?

CommonValidations.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace ProjectName.Models
{
    public class CommonValidations
    {
        [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
        public sealed class EmailFormatValidAttribute : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if (value != null)
                {
                    var expression = @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$";
                    return Regex.IsMatch(value.ToString(), expression);
                }
                else
                {
                    return false;
                }
            }
        }
    }
}

А вот код, с которого я хочу использовать проверку:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Growums.Models;

namespace ProjectName.Models
{
    public class PrivacyModel
    {
        [Required(ErrorMessage="Required")]
        [EmailFormatValid(ErrorMessage="Invalid Email")]
        public string Email { get; set; }
    }
}

1 Ответ

1 голос
/ 24 мая 2011

Вы объявили EmailFormatValidAttribute как подкласс для CommonValidations. Таким образом, вы должны ссылаться на него как CommonValidations.EmailFormatValidAttribute. Или же переместите класс EmailFormatValidAttribute из класса CommonValidations.

Это должно работать:

[CommonValidations.EmailFormatValid(ErrorMessage="Invalid Email")]
public string Email { get; set; }

Кстати, вы можете упростить свой класс следующим образом:

public class EmailFormatValidAttribute : RegularExpressionAttribute
{            
   public EmailFormatValidAttribute() : 
      base(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$")
   {}
}

Также взгляните на это: Расширения аннотаций данных . Это отличная библиотека DataAnnotations, в которую уже включены самые распространенные проверки.

...