2016-10-19 3 views
0

私はFluentValidationをMVC Webサイトに設定しています。FluentValidationが間違った時刻に妥当性検査を行っています

RuleFor(m => m).Must(m => reimbursementMonthsRequired(m)).WithMessage("Wrong!").WithName("ReimbursementStartMonth"); 

reimbursementMonthsRequired機能が有効性を判断するために、オブジェクトの下のオブジェクトの値とコレクションをチェックします:私の目的の1つは、関数を呼び出す必要がありますコマンドを使用して検証チェックを持っています。

私はそのコレクションを更新するために使用される値のリストを受け付けPostメソッドを持っています。

[HttpPost] 
public ActionResult AddGrant(Grant item, List<byte> reimbursementMonths) 
{ 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    if (ModelState.IsValid) 
    {  
    Database.Grants.Add(item); 
    Database.SaveChanges(); 
    ... 

私がいる問題はUpdateReimbusementMonthsがある前に、この機能では、検証チェックが呼び出されるということですと呼ばれる。したがって、検証チェックが正しく機能するために必要なデータはまだありません。奇妙なことは、私の編集機能では、UpdateReimbursementMonthsを呼び出した後に検証が行われるため、正しく動作するということです。これは、それがやっていることです。

[HttpPost] 
public ActionResult EditGrant(int id, List<byte> reimbursementMonths) 
{ 
    var item = Database.Grants.Find(id); 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    TryUpdateModel(item); 
    if (ModelState.IsValid) 
    ... 

だから私は私の追加機能は、適切な時間に検証を行うことを得るのですか - コレクションを更新するために、関数呼び出しの後であること?その関数呼び出しの後で検証チェックを再実行できればうまくいくようです。

+0

あなたが言ったバリデーションは、グラントオブジェクトのものですか? – pjobs

+0

最高の解決策ではありませんが、あなたはどうですかModelState.IsValidの前に(ModelState.Removeを使用して)KeyStateからキーを削除しますか?次に、あなたのグラントを追加し、キーをModelStateに追加して、再度検証します。 – Sparrow

答えて

0

私はそれがAddGrantメソッドにEditGrantに似たようなことをさせることがわかりました。代わりに、私はこれをしなかったメソッドのパラメータとして付与オブジェクトを取る:

public ActionResult AddGrant(List<byte> reimbursementMonths) 
{  
    var item = new Grant(); 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    TryUpdateModel(item); 

    if (ModelState.IsValid) 
    {  
    ... 

幸い私はUpdateReimbusementMonths方法でグラントオブジェクトから任意の値を使用しないでください。明らかにTryUpdateModelがバリデーションプロセスをトリガーするので、私は何か他のことを理解しなければならないでしょう。

0

それはそれはそれはあなたのアクションメソッドで任意のコードを実行する前に自動バインドした後に検証を行いんので、あなたが助成対象を投稿しているAddGrant方法でdocumentation

に応じて取り組んでいます。

- >投稿する前に払い戻しを更新するか、流暢な妥当性検査を削除して、アクションメソッドでこの妥当性検査を手動で行う必要があります。

- >もう1つの方法は、Validator Interceptorsというカスタムを作成し、BeforeMvcValidationの方法で払い戻しを許可する項目を更新することです。 (これはハックかもしれないし、理想的ではないかもしれません)

関連する問題