2010-05-21 2 views
2

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

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

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; } 
    } 
} 
+0

Вы имеете в виду, что Visual Studio не распознает ваш атрибут? или компиляция не удалась? или вы получаете ошибку времени выполнения? –

+0

Ошибка компиляции. Он не распознает проверку, если она определена в общем файле валидации. Они находятся в одном пространстве имен. –

ответ

1

Вы указали 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]$") 
    {} 
} 

Кроме того, посмотрите на это: Data Annotations Extensions. Это отличная библиотека DataAnnotations, которая уже включает в себя самые распространенные проверки.

+0

:: вздох :: Спасибо. Вырезать и вставить удары снова :) Вы правы, я только что вставил свой атрибут проверки в класс, который создал VS для меня, тем самым вложив класс (технически говоря, это не «подкласс», если он не наследует от CommonValidations, но я получите свою точку зрения). Спасибо, что указали мою ошибку. –

+0

означает сказать, что вложенный класс, а не подкласс :) кстати, если вы хотите иметь валидацию на стороне клиента, а то, что вы сделали, недостаточно просто, вам также нужно иметь валидатор для клиентской стороны. –