PropertyInfo to Expression <func <tmodel,tproperty =“”>&gt; </func <tmodel,>

时间:2014-04-14 13:03:02

标签: c# asp.net-mvc-3 razor reflection

我想为ASP.NET和Razor创建一种WebGrid 2.0。

定义ModelClass(TData)WebGrid应该自己为表创建HTML。

应通过反射(typeof(TData).GetProperties)读取TData的属性。属性的属性应该定义一些css和html样式甚至一些数据(DisplayNameAttribute =&gt; ColumnHeader)。

现在我想到了,当我想调用htmlHelper.DisplayFor(... propertyInfoToExpression ...)来渲染数据内容时。

当我只获得数据(行)/模型和propertyInfo时,我怎么能调用DisplayFor?


的WebGrid级:

public class TableModel<TData>{

     private readonly IList<TData> _rows;
     private readonly IList<TableColumn<TData>> _columns = new List<TableColumn<TData>>();


     public TableModel(IList<TData> rows) {
        _rows = rows;

        PropertyInfo[] propertyInfos = typeof(TData).GetProperties();
        foreach (PropertyInfo property in propertyInfos) {
            if (!Attribute.IsDefined(property, typeof(NoColumnAttribute))) {
                _columns.Add(new TableColumn<TData>(property));
            }
        }

    }

    private MvcHtmlString GetCellHtml(HtmlHelper<TData> helper, TableColumn column, TData dataRow){

         TagBuilder cellTagBuilder = new TagBuilder("td");
         cellTagBuilder.InnerHtml = helper.DisplayFor(...propertyInfoToExpression...)

    }

    public MvcHtmlString ToHtml(HtmlHelper helper){
         TagBuilder tableTagBuilder = new TagBuilder("table");
         TagBuilder headTagBuilder = new TagBuilder("thead");
         TagBuilder bodyTagBuilder = new TagBuilder("tbody");

         ...
         return new MvcHtmlString(tableTagBuilder);
    }
}

TData的示例类只是为了抓住这个想法:

public class UserModel{

      [NoColumnAttribute]
      public int Id{get;set;}

      [CssClass("name")]
      public string Firstname {get;set;}

      [CssClass("name")]
      public string Lastname{get;set;}

      [CssClass("mail")]
      public string Mail{get;set;}

      [CssClass("phone")]
      public string Phone{get;set;}

}

2 个答案:

答案 0 :(得分:2)

你可以这样试试:

        var properties = typeof (TModel).GetProperties();
        foreach (PropertyInfo info in properties)
        {
            ParameterExpression p1 = Expression.Parameter(typeof(TModel), "m");
            ParameterExpression p2 = Expression.Parameter(info.PropertyType, "m."+info.Name);
            Expression<Func<TModel, dynamic>> exResult = Expression.Lambda<Func<TModel, dynamic>>(p1, p2);

            helper.DisplayFor(exResult);
        }

很抱歉,花了一段时间。不得不做一些其他的工作。

答案 1 :(得分:1)

你试过......

private MvcHtmlString GetCellHtml(HtmlHelper<TData> helper, TableColumn column, TData dataRow){

     TagBuilder cellTagBuilder = new TagBuilder("td");
     cellTagBuilder.InnerHtml = helper.Display(column.PropertyInfo.Name, dataRow);
     ...
}

...

如果您只需要DisplayFor方法GetCellHtml,那么您根本不需要从PropertyInfo构建表达式。