2009-05-02 9 views
1

人々が既にこの質問をしているのか、 の人がこの問題を見ていないのかわかりません。Asp.net MVCフォームの検証関連

私はそれぞれの作成ビューに対して強いタイプのビューを作成しています。

LINQクラスのエンティティの部分クラスを作成することで、サーバー側のフォームを検証しています。

public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     if (String.IsNullOrEmpty(Name)) 
      yield return new RuleViolation("Name is Required", "Name"); 
     if (String.IsNullOrEmpty(Date.ToString())) 
      yield return new RuleViolation("Date is Required", "Date"); 
     yield break; 
    } 

私のコントローラのアクションのように機能を追加することにより

alt text http://www.scottgu.com/blogposts/mvcpreview5/step15.png

問題のように構成されています

名フィールドの長さは、VARCHAR2(10)であり、ユーザは超え名を入力した場合この制限は、製品(画像参照)のオブジェクトはのようになります。の文字列は空白です。

その他の問題以上のようなもの日付ユーザーが日付を入力しない場合、オブジェクトには1/1/0001のような日付が付きます。

要約:このメソッドを使用する必要がありますか? FormColletionまたはRequest.Formを使用してすべての要素を取得するなどのメソッドを使用する...

カム私にそれのための最善の提案を教えてください?

また、この問題に対する潜在的な解決策がたくさんありますJustin_etheredge's post

答えて

1

を参照してください。

  • 文字列の場合:私は、リフレクションを使用してLINQエンティティプロパティの列属性から文字列の最大長を取得し、これらをチェックします。または、列が切り捨てられた場合に挿入時に発生するエラーを処理できます。

  • 日付の場合:ユーザーが入力する必要がある日付または自動化できる日付の健全性チェックを行うことができます。プロパティはデザイナーで自動生成され、読み取り専用です。フォームにこれらの日付を入れないでください。ページを投稿するときにエンティティに設定されません。これは "Create Date"などで機能します。変更日時は、同様の操作を行いますが、更新時のデフォルトではなく、更新トリガによって生成された値を持ちます。

  • ブール値(デフォルトはfalse):値プロバイダーがフィールドの値を試行していることを検証し、エンティティー自体で検証します。また、列をNULLにすることができ、NULLでないことを確認することもできます。どちらも妥協ですが、後者はデータモデルを検証フレームワークに適合させるので、私は前者を優先します。

1

これは、1つの方法ですが、MVCパターンがかなり破損しています。チェックを実行する方法は基本的にLINQとそのコンテキストを処理することを許可することです - それが問題を解決する理由です。理想的には、コントローラーと実際のデータ(たとえば、サービスレイヤー(ビジネスインテリジェンス(BI)レイヤーはビジネスワールドで呼び出される)の間にレイヤーを作成することが理想的です。

サービスレイヤでは、名前の長さ、日付の有効性、何が許可されているかなど、ルールを実装する場所です。そこに何か問題がある場合は、エラーを吹き飛ばして、コントローラーに対処させることができます。

理想的には、コントローラと実際のロジック間にレベルの抽象化を作成したいと考えています。

私はすぐに例を得ることができれば、我々は何MS Entity Frameworkの程度、その後LINQtoSQLクラスを使用していけない場合、私は

+0

(何かは現時点では来ています...)わかりますか? MS EFのこの問題について私にはわかりません... – Vikas

+0

はい、Microsoft Entity Frameworkでは文字列についてこの問題がありませんが、提案したとおりにGetRuleViolation()というMy funtionで確認できます。 。あなたはこれについて何を言っているのですか?今私はデモプロジェクトを完了させています。 LINQtoSQLをEntityフレームワークに変更する必要がありますか?それは危険なことでしょうか?または、あなたが言ったように論理層に入ることができますか?もしそうなら、もっと精巧にできますので、MVCプロジェクトのベースラインを改善するのに役立ちます。 – Vikas