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并且MyOtherType具有类似的属性,Id但这里没有继承,它们是完全独立的对象,因此我限制了我TProperty的 asIList<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 回答