2012-02-10 13 views
0

私のアプリケーションには、必須であるかどうかにかかわらず動的に設定する必要のあるプロパティがあるため、[[必須]データ注釈の付与。プロパティのModelMetadataにIsRequiredを設定すると、検証が追加されない

これは、私が望むことを達成するための最良の方法ではないかもしれません。だから私はその点でglady annyの提案を受け入れます。 私はDataAnnotationsModelMetadataProviderをオーバーライドしています

public class DynamicFieldsMetadataProvider : DataAnnotationsModelMetadataProvider 
    { 
     public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType) 
     { 
      if (containerType == null) 
       throw new ArgumentNullException("containerType"); 

      if (!typeof(DynamicFieldDataItem).IsAssignableFrom(containerType)) 
       foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType)) 
        yield return metadataProperty; 
      else 
       foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType)) 
       { 
        var dynamicField = (DynamicFieldDataItem)container; 
        if (metadataProperty.PropertyName == "DataFieldValue") 
         metadataProperty.IsRequired = dynamicField.IsRequired; 
        yield return metadataProperty; 
       } 

     } 
} 

これは単なるコンセプトテストで、私はそれを動作させると、私はちょうどに設定することができることで、これまでに、ダイナミックでより多くのオブジェクト指向何かにそれを変更しますが、プロパティDataFieldValueのMetadataModelをIsRequired = trueにすることができます。

私は成功した(私はこれは十分だろうと、思った!)動的な方法で真でIsRequiredこのプロパティを設定し、私は私の見解でdebuggときこれにより

@Html.EditorFor(model=>model.DataFieldValue) 

財産DataFieldValueが宣言されていますこのように:

public class DynamicFieldDataItem 
    { 
     public string DataFieldValue { get; set; } 
     public bool IsRequired{ get; set; } 
    } 

私は、メタデータは、真でIsRequiredこの性質を持っていることがわかりますが、「DataFieldValueが」レンダリングされるときに「バリ」がなく、もちろん検証が動作しません。

私のプロジェクトの設定に問題がなかったことを確認するために、web.configと検証のためのjavascriptをチェックしましたが、すべて正しく設定されています。さらに、プロパティのRequiredを次のようにプロパティに追加すると、次のようになります。

public class DynamicFieldDataItem 
    { 
     [Required] 
     public string DataFieldValue { get; set; } 
     public bool IsRequired{ get; set; } 
    } 

検証は完全に機能します。

誰でも私にヒントを教えてもらえますか?あるいは、私が間違っていることを教えてください。

ありがとうございます!私はあなたがNuGetを使用してプロジェクトにそれをインストールすることができ、そしてあなたはそれをカスタム検証クラスを作成することができますMVC

http://fluentvalidation.codeplex.com/wikipage?title=mvc

ためFluentValidationを見てお勧めします高度な検証のために

答えて

1

1

私は、カスタムModelMetadataProviderとカスタムModelValidatorProviderの両方が必要であると信じています。私の経験から、彼らはお互いを活用しているようではなく、両方とも異なるバリデーションをセットアップするようです。

関連する問題