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; }
}
}
Вы имеете в виду, что Visual Studio не распознает ваш атрибут? или компиляция не удалась? или вы получаете ошибку времени выполнения? –
Ошибка компиляции. Он не распознает проверку, если она определена в общем файле валидации. Они находятся в одном пространстве имен. –