2011-01-17 19 views
4

Fluent Validationをクライアント側の検証で正しく機能させるようにしたいと考えています。私はASP.NET MVC 3を使用しています。流暢な検証が長さに作用しません

タイトルは必須で、1から100文字の長さでなければなりません。だから私がタイトルに入力している間、私のルールセットにないエラーメッセージが表示されます。ここに私のルールが設定されている:私は私が間違っているのかわからないんだけど

Please enter a value less than or equal to 100 

ここ
RuleFor(x => x.Title) 
    .NotEmpty() 
    .WithMessage("Title is required") 
    .Length(1, 100) 
    .WithMessage("Title must be less than or equal to 100 characters"); 

が表示されるエラーメッセージです。ここに私のglobal.asaxがあります:

// FluentValidation 
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(new AttributedValidatorFactory())); 

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
    new AttributedValidatorFactory()); 

答えて

11

私にとってはうまく動作します。ここで手順は次のとおりです。

  1. 新しいASP.NET MVC 3 RTMプロジェクトを作成し、デフォルトを使用して、Visual Studioのテンプレートが
  2. 2つのフォルダがあるように注意してください(最新FluentValidation.NET
  3. 参考にFluentValidation.dllFluentValidation.Mvc.dllアセンブリをダウンロード.zipファイル内部:MVC2とMVC3はとても適切なアセンブリを選択してください)

モデルを追加します。

[Validator(typeof(MyViewModelValidator))] 
public class MyViewModel 
{ 
    public string Title { get; set; } 
} 

と対応バリ:

public class MyViewModelValidator : AbstractValidator<MyViewModel> 
{ 
    public MyViewModelValidator() 
    { 
     RuleFor(x => x.Title) 
      .NotEmpty() 
      .WithMessage("Title is required") 
      .Length(1, 5) 
      .WithMessage("Title must be less than or equal to 5 characters"); 
    } 
} 

Application_Startに入れる:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(new AttributedValidatorFactory())); 

ModelMetadataProviders.Current = new FluentValidationModelMetadataProvider(
    new AttributedValidatorFactory()); 

コントローラを追加:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

と対応するビュー:

@model SomeApp.Models.MyViewModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(x => x.Title) 
    @Html.ValidationMessageFor(x => x.Title) 
    <input type="submit" value="OK" /> 
} 

タイトル入力を空にするフォームを提出しようとする=>クライアント側の検証がキックバックされ、タイトルが必要ですメッセージが表示されます。テキスト入力を開始する=>エラーメッセージが消えます。入力ボックスに5文字以上入力すると、タイトルは5文字以下でなければなりません検証メッセージが表示されます。だから、すべてが期待通りに機能するようです。

+0

ありがとうDarin。私はあなたがそれを持っているのとまったく同じです。 Jeremy Skinner(FluentValidationの助けを借りて)の助けを借りて私はエラーを見つけました。私のテキストボックスには、maxlengthプロパティがmaxとしてありました。これによりJquery検証トリガが正しくトリガされませんでした。 –

+6

@Brendanだから、質問するときにできるだけ多くのシナリオを提供する必要があります。それらの詳細がソースコード形式の下にあれば、より良いでしょう。私が質問に答えるとき、私はいつも人々が自分のマシンでその動作を簡単に再現できるように、完全なソースコードを提供しようとします。また、私は物事を素早く試して模擬することができます。 –

関連する問題