【问题标题】:Writing html extension that accept list of Lambda expressions for accessing Properties编写接受 Lambda 表达式列表以访问属性的 html 扩展
【发布时间】:2018-06-27 12:40:08
【问题描述】:

我想写一个生成HTML表格的html扩展;

public static class HtmlHelpers
{
    public static IHtmlString DisplayPropreties<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, params Expression<Func<TModel, TProperty>>[] expressions)
    {
        // some code here
    }
}

问题是当我想从视图中调用方法时:

@Html.DisplayPropreties(model => m.Id, model => m.Property1, model => m.Property2)

我收到错误:

方法的类型参数 'HtmlHelpers.DisplayPropreties(HtmlHelper,参数 Expression>[])' 不能用 当前使用情况。尝试明确指定类型参数

我有一段时间没有接触 c# (3+y),我不完全明白我需要做什么。

【问题讨论】:

    标签: c# razor


    【解决方案1】:

    Demo Online

    然后你可以使用Json.Net的Jsonconvert Serialize 集合对象

    然后将对象集合反序列化为DataTable

    调用 ConvertDataTableToHTML 方法从 DataTable 对象中获取 HtmlTable。

    public static class HtmlHelpers
    {
        public static string ToHtmlTable(this HashSet<dynamic> obj)
        {
            return ToHtmlTableConverter(obj);
        }
    
        public static string ToHtmlTable(this ICollection obj) {
            return ToHtmlTableConverter(obj);
        }
    
        public static string ToHtmlTable(this System.Data.DataTable obj)
        {
            return ConvertDataTableToHTML(obj);
        }
    
        private static string ToHtmlTableConverter( object obj  )  
        {
            var jsonStr = JsonConvert.SerializeObject(obj);
            var data = JsonConvert.DeserializeObject<System.Data.DataTable>(jsonStr);
            var html = ConvertDataTableToHTML(data);
            return html;
        }
    
        private static string ConvertDataTableToHTML(System.Data.DataTable dt)
        {
            var html = new StringBuilder("<table>");
    
            //header
            html.Append("<thead><tr>");
            for (int i = 0; i < dt.Columns.Count; i++)
                html.Append("<th>" + dt.Columns[i].ColumnName + "</th>");
            html.Append("</tr></thead>");
    
            //body
            html.Append("<tbody>");
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                html.Append("<tr>");
                for (int j = 0; j < dt.Columns.Count; j++)
                    html.Append("<td>" + dt.Rows[i][j].ToString() + "</td>");
                html.Append( "</tr>");
            }
    
            html.Append("</tbody>");
            html.Append("</table>");
            return html.ToString();
        }
    }
    

    【讨论】:

    • Tnx 为您解答!我想要的是显示一些对象属性。我希望我的调用是这样的:@Html.DisplayPropreties(model => m.Id, model => m.Property1, model => m.Property2) 结果应该是 2 列 3 行的表;第一行是属性名称,第二行是值;使用您的解决方案,我需要创建其他类或添加其他属性;为了简短起见,我不想添加其他类,我只想向视图显示可变数量的对象属性:) 使用您的解决方案,我需要创建具有属性名称/值的数组
    • 让我想想……@Darkves
    【解决方案2】:

    这正是错误所说的。您需要指定类型参数,因为它们无法推断,例如:

    HtmlHelpers.GenerateTable<Foo, Bar>(model => m.Id, model => m.Property1, model => m.Property2);
    

    【讨论】:

    • 你能解释一下吗? Foo 是模型类型,而 Bar 是属性类型(m.Id)?如果是这样的话,我认为它不会起作用,因为属性可以是任何类型(字符串、数字、日期时间等)
    • 这样做后我得到:无法将方法组“DisplayPropreties”转换为非委托类型“对象”。您是否打算调用该方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多