2012-01-06 19 views
1

ASP.NET MVC3/Razor newbie質問:カスタム検証が機能しないのはなぜですか?

カスタム検証でモデルを設定しています。 [Required][RegularExpression(...)]のようなもので飾るプロパティは期待どおりに実行されていますが、カスタム検証が機能していないことがわかりました。私はモデルIValidatableObjectを実装しましたが、Validate()メソッドの中でブレークポイントをヒットして、yield return new ValidationResult(...);を実行するメソッドを見ることができますが、それにもかかわらずフォームはポストされます。

秘密のスイッチがありますか?

+2

あなたはクライアント側を意味しますか?はいの場合は、ビューに検証スクリプトを含めてください –

+0

コードを表示できますか? –

答えて

1

IValidatableObjectを使用してモデルのプロパティを検証すると、フォームがポストされます。 Joeriヤンスが言うように、あなたはまだこれを防ぎ、あなたのアクションメソッドの間、ユーザーにページを返すことができます。

public ActionResult MyAction(MyModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // code to perform action when input is valid 
     return [return something] 
    } 
    return View(model); // re-display form because ModelState.IsValid == false 
} 

あなたが掲示されてからフォームを防ぐために、あなたのカスタム検証をしたい場合は、クライアント上で検証する必要があります。これを行う最も簡単な方法は、RemoteAttributeを使用する方法です。

public class MyModel 
{ 
    [Remote("MyValidateAction", "MyController", HttpMethod = "POST")] 
    public string MyProperty { get; set; } 
} 

あなたはまだIValidatableObjectであなたのコードを維持し、そのようなアクションメソッドからそれを検証することができます。

[HttpPost] 
public virtual JsonResult MyValidateAction(string myProperty) 
{ 
    var model = new MyModel{ MyProperty = myProperty, }; 
    var results = new List<ValidationResult>(); 
    var isValid = Validator.TryValidateObject(model, 
     new ValidationContext(model, null, null), results, true); 
    return isValid 
     ? Json(true) 
     : Json(results[0].ErrorMessage); 
} 

上記のアクションメソッドは、デフォルトのモデルバインダーとほぼ同じことを行います。あなたのビューモデルのインスタンスを構築し、それを検証します。 IValidatableObjectコードを含め、すべての検証ルールがチェックされます。あなたのviewmodelの構築のためのアクションメソッドにもっと多くのプロパティを送る必要があるならば、RemoteAttributeのAdditionalFieldsプロパティでそれを行うことができます。

これが役に立ちます。

+0

+1と包括的な答えのクレジットに答えます。ありがとう! –

2

サーバー側の検証については、ModelState.Isvalidチェックがありますか? http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

+1

これは答えではありません。これは質問です。質問は、質問のコメント欄でうまくいくでしょう。 – Dangerous

+0

@Dangerous - 公平なコメントですが、とにかく私が何が欠けていたかを指摘しています。 –

+0

@危険な私は質問にコメントするオプションが表示されなかったので、私はここに置く。 – JoJa

関連する問題