0

Visual Studio 2010 で asp.net mvc 3 アプリを作成しています。モデルに FluentValidation を使用しようとしています。NuGet を使用してパッケージ (FluentValidation、FluentValidationMVC3) をインストールしました。私のモデルは次のとおりです(このフォーラム用に簡略化されています):

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);
}

TimeModel のインスタンスに無効な値を割り当てても、ModelState は常に true です。次に、このプロジェクトは、personal.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\Attributes\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 を使用している人にこの問題がありましたか? 問題を解決するにはどうすればよいですか? それが違いを生む場合、私のプロジェクトはネットワーク共有にあります。

4

1 に答える 1

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 メタデータ プロバイダーを有効にするために、次の行があることを確認してください。

FluentValidationModelValidatorProvider.Configure();

回線の爆撃に関するpersonnel.SaveChagnes()限り、これは ASP.NET MVC にも FluentValidation.NET にもまったく関係ありません。問題を抱えているのは、使用しているデータ アクセス テクノロジだと思います。

于 2012-06-20T06:13:32.520 に答える