Введите вашу проверку в вашу модель.
Атрибуты валидации могут стать неудобными для работы, когда ваши истории валидации становятся более сложными. Тьфу!
Мне нравится использовать Entity Framework с Code First. У меня есть полный контроль над моей моделью на тот момент. Я также использую FluentValidation, как @Darin Dimitrov, и мне очень нравится его простота использования и простой синтаксис.
Вот как ты это собрал.
Я предполагаю, что у вас есть сборка с вашими интерфейсами или контрактами.
Это будет базовый интерфейс для ваших моделей ...
using System.ComponentModel;
using FluentValidation.Results;
public interface IAbstractBase : IDataErrorInfo
{
bool IsValid { get; }
ValidationResult SelfValidate();
}
и его аналог на бизнес-уровне выглядит следующим образом ...
using System;
using System.Linq;
using FluentValidation.Results;
using Contracts;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public abstract class AbstractBase : IAbstractBase
{
#region IDataErrorInfo
public abstract ValidationResult SelfValidate();
[NotMapped]
public bool IsValid
{
get
{
return SelfValidate().IsValid;
}
}
[NotMapped]
public string Error
{
get
{
var results = SelfValidate().Errors.Select(s => string.Format("● {0}{1}", s.ErrorMessage, Environment.NewLine)).ToArray();
return string.Join("", results);
}
}
[NotMapped]
public IList<ValidationFailure> Errors
{
get
{
var results = SelfValidate().Errors;
return results;
}
}
[NotMapped]
public string this[string columnName]
{
get
{
var validationResults = SelfValidate();
if (validationResults == null) return string.Empty;
var columnResults = validationResults.Errors.FirstOrDefault(x => string.Compare(x.PropertyName, columnName, true) == 0);
return columnResults != null ? columnResults.ErrorMessage : string.Empty;
}
}
#endregion
}
Это ваш базовый класс для ваших моделей. Убедитесь, что вы реализуете абстрактный метод в своих моделях. Это должно выглядеть так.
public class MyModel : AbstractBase, IMyModel
{
private AbstractValidator<IMyModelValidator> _myModelValidator;
public MyModel():this(new MyModelValidator()){};
public MyModel(AbstractValidator<IMyModelValidator> myModelValidator){
_myModelValidator = myModelValidator;
};
public int MyModelId { get; set; }
public string Name { get; set; }
public DateTime CreatedDate { get; set; }
public override ValidationResult SelfValidate()
{
return _myModelValidator.Validate(this);
}
}
Ваш класс валидатора будет выглядеть примерно так.
public class MyModelValidator : AbstractValidator<IMyModelValidator>
{
private IMyModelProvider _myModelProvider;
public MyModelValidator(IMyModelProvider myModelProvider){ _myModelProvider = myModelProvider;};
private void SetRules()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("Please specify a project name.");
RuleFor(x => x.Name.Length).LessThanOrEqualTo(100).WithMessage("The project name must be less than or equal to 100 characters.");
}
public override ValidationResult Validate(IMyModel instance)
{
SetRules();
return base.Validate(instance);
}
}
Передайте результаты проверки вашей модели на ваше представление в вашем контроллере, используя следующий вызов в вашем контроллере.
TryValidateModel(your model here);
После вызова этого в вашем контроллере вызовите свойство model.IsValid.
Убедитесь, что вы зарегистрировали все, и вы должны быть в порядке. Я полагаю, вы можете заполнить недостающие фрагменты.
Большая картинка выглядит так: