2010-12-04 11 views
2

私はMVCとSIlverlightの両方でメタデータ検証を併用しています。しかし、Silverlightのクラスは動作していません。Silverlight 4には存在しないMetadataTypeAttributeが原因です。これは私のプロジェクトのこの部分で保持されている唯一のものです...私はeverthingカスタム私は車輪の再発明したいといけないよう、しかしバリデーションクラスが期待される結果をレンダリングするように見えるいけない..:シルバーライト、カスタムEF POCO、カスタム検証 - メタデータを活用し、Silverlight 4で動作しない

var metadataAttrib = this.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault(); 
      var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : this.GetType(); 
      var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>(); 
      var modelClassProperties = TypeDescriptor.GetProperties(this.GetType()).Cast<PropertyDescriptor>(); 

     var brokenRules = from buddyProp in buddyClassProperties 
          join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name 
          from attribute in buddyProp.Attributes.OfType<ValidationAttribute>() 
          where !attribute.IsValid(modelProp.GetValue(this)) 
          select new BrokenRule() { FieldName = buddyProp.Name, ErrorMessage = attribute.FormatErrorMessage("") }; 

     brokenRulesList = brokenRules.ToList(); 

...そして、ここにある:ここで

は、CLRのための私のソリューションです。 Silverlight用コード

var metadataAttrib = this.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault(); 
      var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : this.GetType(); 
      var buddyClassProperties = buddyClassOrModelClass.GetType().GetProperties(); 
      var modelClassProperties = this.GetType().GetProperties(); 

      var validationContext = new ValidationContext(this, null, null); 

      var validationResults = from buddyProp in buddyClassProperties 
           join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name 
           from attribute in buddyProp.GetCustomAttributes(true).OfType<ValidationAttribute>().Cast<ValidationAttribute>() 
           where buddyProp.Name == modelProp.Name 
           select attribute.GetValidationResult(modelProp, validationContext); 

      brokenRulesList = new List<BrokenRule>(); 
      foreach (ValidationResult vr in validationResults) 
      { 
       foreach (string memberName in vr.MemberNames) 
        brokenRulesList.Add(new BrokenRule() { FieldName = memberName, ErrorMessage = vr.ErrorMessage }); 

      } 

は...しかし、Silverlightのコードが動作していない...ここで

[MetadataType(typeof(UserMetadata))] 
    public partial class User 
    { 
     public partial class UserMetadata 
     { 

     [Required(ErrorMessageResourceName = "UserIDValidationMessage", ErrorMessageResourceType = typeof(AppResources))] 
      public System.Guid ID { get; set; } 

      public Nullable<int> UID { get; set; } 

     [Display(Name="UserUsernameLabel", Description="Username", ResourceType=typeof(AppResources))] 
     [Required(ErrorMessageResourceName = "UserUsernameValidationMessage", ErrorMessageResourceType = typeof(AppResources))] 
     [StringLength(70, ErrorMessageResourceName="UserUsernameValidationMessage", ErrorMessageResourceType = typeof(AppResources))] 
      public string Username { get; set; } 

     [Display(Name="UserFirstNameLabel", Description="First Name", ResourceType=typeof(AppResources))] 
     [StringLength(90, ErrorMessageResourceName="UserFirstNameValidationMessage", ErrorMessageResourceType = typeof(AppResources))] 
      public string FirstName { get; set; } 
} 

が、私はそれをコンパイルすることができますSilverlightのクラスを作った...テストケースであるが、そのは動作していない - 予想通り..

using System; 
using System.Reflection; 

namespace System.ComponentModel.DataAnnotations 
{ 
    public class MetadataTypeAttribute : Attribute 
    { 
     public MetadataTypeAttribute(Type t) 
     { 
      MetadataClassType = t; 
     } 

     public Type MetadataClassType 
     { 
      get; 
      set; 
     } 

    } 
} 

誰でも簡単にSilverlightのメタデータクラスに活用する方法を知っていますか?メタ属性の属性が存在しない理由は分かりません。助言がありますか?

答えて

0

あなたは検証がSilverlightで属性を使用したい場合は、3つのいずれかの操作を行う必要があります

  1. は、データを表示するには、ツールキットのDataGridを使用する - これは自動的にあなたの特性を検証し(私は他のコントロールを見てきました

  2. プロパティセッターで手動で検証し、値が有効でない場合はValidationExceptionをスローします。これは、TelerikのRadGridViewのようなものです。また、バインディングでValidatesOnExceptionsとNotifyOnValidationErrorをtrueに設定する必要があります。

  3. Implement INotifyDataErrorInfo or IDataErrorをモデルに追加し、これらのインターフェイスのメソッドを使用して検証エラーを設定します。

オプション3は、お使いの目的に最も適しているように見えます。

最後に、INotifyDataErrorInfoインタフェースは少し困難なことができます詳細msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx

ために、このリンクをチェックアウト - ありあなたがそれを使用することができる前に整理するための配管の多く。しかし、Jeremy Liknessのthis postが少し役に立ちます。 例のようにセッターで検証する必要はありません。

関連する問題