2011-08-11 7 views
2

asp.net mvcフォームでは、通常、DisplayName、Description、およびRequiredなどのビューモデルプロパティに属性を追加します。asp.net mvc属性なしのモデルメタデータの追加

次に、プロパティごとにHtml.EditorFor(model => model.PropertyName)を呼び出します。

私は、このような属性を適用できる強く型付けされたビューモデルを持っていない状況があります。代わりに、私は次のクラスのリストを持っている:EditorForヘルパーと検証がまだ動作するよう

public class AttributeValue 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool Required { get;set; } 
    public object AttributeValue { get; set; } 
} 

はどのようにして、手動で上記のクラスに格納されている情報を使用してメタデータを追加することができますか?

答えて

4

カスタムModelMetadataProviderとModelValidatorProviderクラス

public class DynamicModelValidatorProvider : ModelValidatorProvider 
{ 
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context) 
    { 
     // you validation logic go there 
     yield break; 
    } 
} 


public class DynamicModelMetadataProvider : ModelMetadataProvider 
{ 
    public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType) 
    { 
     yield return new ModelMetadata(this, containerType, null, typeof (string), "Hello"); 
     yield return new ModelMetadata(this, containerType, null, typeof (string), "World"); 
    } 

    public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName) 
    { 
     return GetMetadataForProperties(null, containerType).SingleOrDefault(x => x.PropertyName == propertyName); 
    } 

    public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType) 
    { 
     return new ModelMetadata(this, null, modelAccessor, modelType, null); 
    } 
} 
を書く必要があります
0

私はあなたがカスタムオブジェクトテンプレートを書く方がはるかに良いと思います。 、そこから

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

あなたは、両方のディスプレイのデフォルトのオブジェクトのテンプレートがあります:

あなたがここに見つけることができますASP.NET MVCでのテンプレートで作業する方法についてはブラッド・ウィルソンのシリーズをチェックしてください編集してください。

値のメタデータを取得するのではなく、モデルから取得するようにテンプレートを変更する必要があります。

関連する問題