2011-11-10 9 views
1

私はmvc3アプリケーションで作業しており、検証がうまく動くようにいくつかの問題があります。バディクラスを使用しているときのmvc3検証

アプリケーションは、モデルにバディークラスを使用しています。 (これは過去に使用していなかったものですが、私はちょっと混乱しています...とにかく使用されています)

データが正しく送信されるようにするために必要なフィールドを追加します。私はバディクラスに必要なフィールドを追加しようとしました。

フォームを送信すると、クライアント側の検証は行われず、デバッガはエンティティフレームワーク生成コードにステップインします。ここでは、null値を含むフィールドが無効であるという不満があります。それらのすべてをステップ実行すれば、最終的にコントローラに到達し、if(ModelState.IsValid)がfalseを示しています。

クライアント側の検証が有効になっています。

私はバディー・クラス・レベルまたはビュー・モデルでデータ検証を適用する予定ですか?

もう1つの質問はバディークラスを使用する理由です。私には彼らは物事を複雑にするようです。

更新

[MetadataType(typeof (CustomerMetaData))] 
public partial class Customer 
{ 
    public string Priorty 
    { 
     get 
     { 
      var desc = (Priority) Priority; 
      return desc.ToString().Replace('_', ' '); 
     } 
    } 

internal class CustomerMetaData 
{ 
    [Required] 
    [DisplayName("Priorty")] 
    public string Priorty { get; set; } 

答えて

1

バディクラスバディクラスの例を追加したデータのアノテーションを使用すると、元のクラスのコントロールしていないとき、すなわち、それを編集することはできません属性を置くためのメタデータクラスです。典型的な状況は、クラスがEntity FrameworkのようなORMによって生成される場合です。

//Can't edit this class 
public partial class YourClass{ 
    public string SomeField {get; set;} 
} 

//Add a partial class 
[MetadataType(typeof(YourClassMetadata))] 
public partial class YourClass{ 
} 

//And a metadata class  
public class YourClassMetadata 
{ 
    [Required(ErrorMessage = "Some Field is required")] 
    public string SomeField {get; set;} 
} 

[MetadataType(typeof(YourClassMetadata))]は本当にありますか?

バディクラス hereについて

ますますhere

+0

こんにちはAmitさん、ありがとうございました。私は使用されているものの例を使って投稿を更新しました。 –

+0

他のものがすべて正しく整列されていることを確認するには、クラス(およびビュー)にintフィールドを追加して、MVCがそれをスローしてエラーになるかどうかを確認します。そうでない場合は、検証自体に問題があります。 –

0

このようなモデルは自動的にORMツールによって生成されたときなどのエンティティクラスにメタデータを追加することはできませんときには、通常、バディクラスを使用します。この場合、適用したメタデータは失われます。したがって、元の(自動的に生成)クラスは部分クラスとして定義されるだろう

public partial class Customer 
{ 
    public string Priority { get; set; } 
} 

そして、あなたは、メタデータを追加するためにあなたの相棒のクラスを生成します。

[MetadataType(typeof(CustomerMetaData))] 
public partial class Customer 
{ 
} 

internal class CustomerMetaData 
{ 
    [Required] 
    public string Priority { get; set; } 
} 

次に、優先度が設定されているビューにCustomerクラスを渡します。

あなたのケースでは、部分クラスが1つしかないのか、それとも2つあるのか分かりません(他のものは表示されませんが、存在する場合は提供してください)。私はあなたがModelState.IsValidの使い方の問題であるかどうか疑問に思っているので、顧客から優先度情報をどのように取得するのかを知りたいと思っていますか?私が尋ねる理由は、設定されたアクセサーがPriorityプロパティで宣言されていないので、これが有効でないことを報告するためにビューからどのように設定されているのだろうか?

0

また、WCFデータ契約によってモデルが自動的に生成される場合など、エンティティクラスにメタデータを追加できない場合は、バディクラスを使用します。

関連する問題