5

タグクラウドに入るデータが式から来るタグクラウドを描画するために、式を使用してカスタムHTMLヘルパーを構築しています。ここでコードに話をさせます:

モデルを見る

public class ViewModel
{
    public IList<MyType> MyTypes { get; set; }
    public IList<MyOtherType> MyOtherTypes { get; set; }
}

意見

<div>
    @Html.TagCloudFor(m => m.MyTypes)
</div>

<div>
    @Html.TagCloudFor(m => m.MyOtherTypes)
</div>

ヘルパー

public static MvcHtmlString TagCloudFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TProperty : IList<MyType> where TProperty : IList<MyOtherType>
{
    // So my actual question here is: how do I get my IList<TProperty> collection 
    // so I can iterate through and build my HTML control
}

私はざっと見て回って、通常のグーグル検索をしました、しかし、私はその特定の答えを完全に見つけることができないようです。の領域のどこかにあるとexpression.Compile().Invoke()思いますが、渡す正しいパラメータが何であるかわかりません。

また、と同様のプロパティを持っているMyTypeことにも言及する必要がありますが、ここには継承はありません。これらは完全に別個のオブジェクトであるため、asとを制約しています。私はここで間違った道を進んでいますか、これは明白なはずだと思いますが、私の脳は遊んでいません。MyOtherTypeIdTPropertyIList<MyType>IList<MyOtherType>

4

2 に答える 2

9

以下はそれを行う必要があります:

public static MvcHtmlString TagCloudFor<TModel , TProperty>( this HtmlHelper<TModel> helper , Expression<Func<TModel , TProperty>> expression )
        where TProperty : IList<MyType>, IList<MyOtherType> {

        //grab model from view
        TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model;
        //invoke model property via expression
        TProperty collection = expression.Compile().Invoke(model);

        //iterate through collection after casting as IEnumerable to remove ambiguousity
        foreach( var item in (System.Collections.IEnumerable)collection ) {
            //do whatever you want
        }

    }
于 2012-08-23T12:51:47.823 に答える
1

どうですか...

public static MvcHtmlString TagCloudFor<TModel , TItemType>( this HtmlHelper<TModel> helper , Expression<Func<TModel , IEnumerable<TItemType>>> expression ) 
// optional --- Where TItemType : MyCommonInterface
 { 

        TModel model = (TModel)helper.ViewContext.ViewData.ModelMetadata.Model; 
        //invoke model property via expression 
        IEnumerable<TItemType> collection = expression.Compile().Invoke(model); 

        foreach( var item in collection ) { 
            //do whatever you want 
        } 

    } 
于 2012-08-23T13:23:26.793 に答える