2011-11-14 33 views
1

配列のインスタンスに関連付けられたメタデータを取得しようとしています。私は私のビューで呼び出されるHtmlHelper拡張を定義しました。モデルのリストとそのエラーメッセージを表示するヘルパーを作成しようとしています。特定のインスタンスのModelMetadataを取得

以下
@model Domain.Models.Customer 
@this.Html.Example(m => m.Orders) 

は、私の知る限りでは、それはありませんがあります以下のドメインクラス

public class Customer 
{ 
    public Order[] Orders { get; set; } 
} 

public class Order 
{ 
    public string Description { get; set; } 
} 

答えて

0

を使用して、私のヘルパー

public static class HtmlHelperExtensions 
{ 
    public static IHtmlString Example<TModel, TInstance>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TInstance[]>> expression) 
    { 
     var instanceProvider = expression.Compile(); 
     var instances = instanceProvider.Invoke(helper.ViewData.Model); 

     if(instances != null) 
     { 
      var properties = typeof (TInstance).GetProperties(); 
      for(var i = 0; i < instances.Length; i++) 
      { 
       var instanceExpression = Expression.ArrayIndex(expression.Body, Expression.Constant(i)); 

       foreach(var info in properties) 
       { 
        var propertyExpression = Expression.Property(instanceExpression, info); 

        // How can i get access to the ModelMetadata 
        ModelMetadata.FromStringExpression(propertyExpression.ToString(), helper.ViewData); 

        // To get the model state we need the following... 
        var text = ExpressionHelper.GetExpressionText(Expression.Lambda(propertyExpression)); 
        var fieldName = helper.ViewData.TemplateInfo.GetFullHtmlFieldName(text); 

        ModelState state; 
        if(helper.ViewData.ModelState.TryGetValue(fieldName, out state)) 
        { 
         // Output errors.... 
        } 
       } 

      } 
     } 

     return MvcHtmlString.Empty; 
    } 
} 

のこの実装であります!

ModelMetadataは、この場合は配列内の要素ではなく、配列自体のプロパティであるモデルのプロパティ用です。

ですから、配列内の要素のためのModelMetadataが必要な場合、あなたはどのあなたが必要な属性を取得し、ModelMetadata、例えば、ガイドコードスニペット

public class ArrayMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 

    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, 
                Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 

     // Add your metadata here 

     return metadata; 
    } 

} 
に追加しますカスタムモデルメタデータプロバイダを作成する必要があります

そして、このプロバイダを次のように登録する必要があります:

protected void Application_Start() 
    { 

     ModelMetadataProviders.Current = new ArrayMetadataProvider(); 

    } 
関連する問題