0

ModelClientValidationRuleをコントローラアクション内から動的に追加できるようにしたいと思います。どのように私は動的にカスタムクライアント検証をAsp.Net Mvc 3で追加できますか?

例:特定の条件に基づいて、クライアントの検証をレンダリングするかどうかを決定したいと考えています。しかし、グローバルレベルで検証プロバイダをオーバーライドすることで、すべてのコントローラにこのカスタムルールを追加する必要はありません。

これはサーバ側の検証だった場合、私はこのようなことをしますが、代わりにレンダリングの前にクライアント側の検証をバインドしたいと思います。

public ActionResult RenderSomething(){ 
    if(IsSomeCondition){ 
     <<Secret Sauce To Render the View with "X" ModelClientValidationRule>> 
    } 
} 

は、私はすべてを出て行くと、完全なフレームワークを回避することができますが、私は可能な限りその中で働くことを好む:

public ActionResult DoSomething(){ 
    ModelState["SomePropertyKey"].Errors.Add(...) 
} 

私はこれを行います秘密のソースを探しています。

助けてください。

答えて

0

2つ目のコードスニペットが明らかにサーバー側のコードであり、何かを達成するためのクライアント側の方法について話しているので、あなたの質問を理解できません。あなたの状態に応じてModelStateにエラーを追加しないでください。または、あなたの質問を明確にして、あなたの必要性を理解するのを助けるかもしれません。

+0

の成功を返すModelValidatorを実装する第二のコードでは、レンダリング中に呼び出されるサーバー側であります、ポストの前に。特定の条件に基づいてクライアント側の検証をパッケージ化するアクションが必要です。私はこれを行うための簡単な方法はありません。 – Alwyn

0

特定のViewModelに対して、名前にPhoneという単語が含まれているすべての文字列プロパティに特定の検証が必要な場合は、T4テンプレートを使用して適切な検証属性とデータアノテーションを含む部分クラスを生成できます。

jQuery-validateを拡張するカスタム検証を作成して、クライアントがサーバーの代わりにこれを実行できるようにすることもできます。

ビジネスルールをグローバルに適用する方法を質問する場合は、ビューレンダリングライフサイクルでOnActionExecutingまたは半ダースのメソッドの1つを実装する独自のベースコントローラを作成することができます。多かれ少なかれ同じことをするが、より柔軟性を与えるActionFilterAttributeを実装する。

B社のデータに対するB社の行動をユーザーに許可しないような操作を行う場合は、ActionFilterAttributeを記述するか、パイプラインにHttpModuleを記述して下位レベルで行うことができます。あなたのWebアプリケーションで何が起こっていてもこれは起こりません。データを編集するためにストアドプロシージャを使用するだけで、データベース上にもこのようなことを実装できます。

あなたが「特別なソース」について明確ではなかったとすれば、私が言うことができるのは、これを行うための特別なルールはないということです。この重要なことは、ルールを適用することが最も効果的であると考えることです。

+0

私にはっきりさせてください。コントローラのアクションレベルでこれを行う必要があります。少なくとも、ActionFilterでは。だから私はカスタムクライアントの検証を注入したいいくつかの条件に応じて。今私はすべてを外に出て自分のフレームワークを構築することができました。スクリプトをビューバックに入れ、それらをフォームなどにバインドし、jquery onloadで実行します。しかし、それは車輪を再発明している。可能であれば、Mvcにはこのメカニズムがあります。 – Alwyn

2

これはコントローラの操作の内側にある必要がありますか?そうでない場合は、独自のModelValidatorProviderを実装するオプションがあります。

public class DynamicModelValidatorProvider : ModelValidatorProvider 
{ 
    public IEnumerable<ModelValidator> GetValidators(
     ModelMetadata metadata, 
     ControllerContext context) 
    { 
     // do your logic here, based off metadata or controllercontext. 
     // you could return common DataAnnotation type validators 
     return new RequiredAttributeAdapter(metadata, context, new RequiredAttribute()); 

     // or maybe your own custom validator? 
    } 
} 

です。あなたがすべてでサーバーサイドのものに興味を持っていない場合はasax

ModelValidatorProviders.Providers.Add(new DynamicModelValidatorProvider()); 

、独自のカスタム堅牢GetClientValidationRules()方法がありますが、常にValidate()

+0

はい、これはすべての回答の中で最も近いと言わなければなりません。私はこれを考慮しましたが、これは私が必要とするほど柔軟ではありません。検証は、かなりのビジネスロジックを必要とするため、実際には動的でなければなりません。私はそれをサーバーサイド/リモート検証にすることができますが、ユーザーは応答性を望んでいます。 – Alwyn

関連する問題