0

Я создаю приложение asp.net mvc 3 в Visual Studio 2010. Я пытаюсь использовать FluentValidation для своих моделей. Я установил пакеты (FluentValidation, FluentValidationMVC3) с помощью NuGet. Мои модели являются следующие (упрощенно для этого форума):Сообщение об ошибке с использованием FluentValidation в приложении MVC3

public class ActivityLine : AbstractValidator<ActivityLine> 
{ 
    [Key] 
    [Required] 
    public int ActivityLineId { get; set; } 

    public virtual ICollection<TimeModel> TimeModels { get; set; } 
} 

public class ActivityLineValidator : AbstractValidator<ActivityLine> 
{ 
    public ActivityLineValidator() 
    { 
     RuleFor(x => x.TimeModels).SetCollectionValidator(new TimeModelValidator()); 
    } 
} 


[Validator(typeof(TimeModelValidator))] 
public class TimeModel 
{ 
    [Key] 
    public int TimeModelId { get; set; } 
    [Required] 
    public int ActivityLineId { get; set; } 
    [Required] 
    public int LineNumber { get; set; } 
    public int startHours { get; set; } 
    public int startMinutes { get; set; } 
    public int endHours { get; set; } 
    public int endMinutes { get; set; } 

    public virtual ActivityLine ActivityLine { get; set; } 

    [NotMapped] 
    public TimeSpan StartTime 
    { 
     get { return new TimeSpan(startHours, startMinutes, 0); } 
     set { startHours = value.Hours; startMinutes = value.Minutes; } 
    } 
    [NotMapped] 
    public TimeSpan EndTime 
    { 
     get { return new TimeSpan(endHours, endMinutes, 0); } 
     set { endHours = value.Hours; endMinutes = value.Minutes; } 
    } 
} 

public class TimeModelValidator : AbstractValidator<TimeModel> 
{ 
    public TimeModelValidator() 
    { 
     RuleFor(timemodel => timemodel.endHours) 
      .GreaterThan(timemodel => timemodel.startHours) 
      .WithMessage("Start Time Must be before End Time"); 
    } 
} 

В моем контроллере:

[HttpPost] 
public ActionResult Create(ActivityLine model) 
{ 
    if (ModelState.IsValid) 
    { 
     personnel.ActivityLines.Add(model); 
     personnel.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    //Model State Not Valid Redisplay Form 
    return View(model); 
} 

ModelState всегда верно даже тогда, когда я задаю недопустимые значения и экземпляр TimeModel. Затем проект бомбит, когда он попадает на личность. СтрокаSaveChagnes(). Я получаю сообщение об ошибке «Нет источника». Деталь ниже:

Locating source for 'c:\Projects\FluentValidation\src\FluentValidation\Attributes\ValidatorAttribute.cs'. Checksum: MD5 {e3 d4 90 62 70 f7 a6 4e 9e ac 62 71 77 21 64 dd} 

файл 'C: \ Projects \ FluentValidation \ SRC \ FluentValidation \ Свойства \ ValidatorAttribute.cs' не существует. Просмотр в документах сценария для 'c: \ Projects \ FluentValidation \ src \ FluentValidation \ Attributes \ ValidatorAttribute.cs' ... Поиск в проектах для 'c: \ Projects \ FluentValidation \ src \ FluentValidation \ Attributes \ ValidatorAttribute.cs ». Файл не найден в проекте. Поиск в каталоге 'C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ crt \ src \' ... Поиск в каталоге 'C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ mfc \ '... Поиск в каталоге' C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ atl \ '... Поиск в каталоге' C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ include \ '... Параметры исходных файлов отладки для активного решения указывают, что отладчик не попросит пользователя найти файл: c: \ Projects \ FluentValidation \ src \ FluentValidation \ Attributes \ ValidatorAttribute.cs. Отладчик не смог найти исходный файл 'c: \ Projects \ FluentValidation \ src \ FluentValidation \ Attributes \ ValidatorAttribute.cs'.

Я предполагаю, что с моей конфигурацией что-то не так, но я не могу понять, что. Кто-нибудь, кто использовал Fluent, имел эту проблему? Что мне нужно сделать, чтобы решить эту проблему? Мой проект находится на сетевом ресурсе, если это имеет значение.

ответ

1

Ваша модель домена ActivityLine не должна выводиться из AbstractValidator. Он должен быть оформлен с атрибутом Validator, как вы сделали с вашей TimeModel:

[Validator(typeof(ActivityLineValidator))] 
public class ActivityLine 
{ 
    [Key] 
    [Required] 
    public int ActivityLineId { get; set; } 

    public virtual ICollection<TimeModel> TimeModels { get; set; } 
} 

public class ActivityLineValidator : AbstractValidator<ActivityLine> 
{ 
    public ActivityLineValidator() 
    { 
     RuleFor(x => x.TimeModels).SetCollectionValidator(new TimeModelValidator()); 
    } 
} 

Также убедитесь, что у вас есть следующие строки в вашем Application_Start, чтобы позволить поставщику FluentValidation метаданных, как объяснено в documentation:

FluentValidationModelValidatorProvider.Configure(); 

Что касается бомбардировки линии personnel.SaveChagnes(), это не имеет ничего общего ни с ASP.NET MVC, ни с FluentValidation.NET. Я думаю, это технология доступа к данным, которую вы используете, с которой вы сталкиваетесь.

+0

Спасибо за быстрый ответ. Боже, я не могу поверить, что я пропустил это. Наверное, я слишком долго смотрел на код. – FrstCBC

Смежные вопросы