生成HTML表格的后台模板代码

有时候,我们需要在后台拼接生成前端的html表格,一般的做法就是各种string、StringBuilder的拼接(例子省略...),这样的话如果表头不同就没法做到代码的重用,增加代码的冗余,下面我分享我的做法,以达到各位大牛抛砖引玉的效果。

首先新建一个公共配置静态类CommonConfiguration:

 public static class CommonConfiguration
    {
        public static string Width { get { return "Width"; } }

        public static string HeaderName { get { return "HeaderName"; } }

        /// <summary>
        /// 定义表格单元
        /// </summary>
        public static string TableTdBody { get { return "<td>{0}</td>"; } }
    }

接着定义一个公共帮助类:

public class CommonHelper
    {
        private const string FormatString = "<table style=\"{0}\" class=\"{1}\">";
        private const string FormatTableHeader = "<th style=\"width:{0}px;\">{1}</th>"; // 定义表头字符串

        /// <summary>
        /// 生成前端table模板
        /// </summary>
        /// <typeparam name="T">表头实体</typeparam>
        /// <param name="style">样式</param>
        /// <param name="className">类名</param>
        /// <param name="bodyString">表身</param>
        /// <param name="tableHeader">表头实体数据</param>
        /// <returns>Table模板</returns>
        public static string HtmlResult<T>(string style, string className, string bodyString,
            List<T> tableHeader) where T : class
        {
            var builder = new StringBuilder();

            builder.AppendFormat(FormatString, style, className);

            builder.Append("<tr>");
            foreach (var item in tableHeader)
            {
                builder.AppendFormat(FormatTableHeader, GetPropertyValue(item, CommonConfiguration.Width),
                    GetPropertyValue(item, CommonConfiguration.HeaderName));
            }
            builder.Append("</tr>");
            builder.Append(bodyString);

            builder.Append("</table>");

            return builder.ToString();
        }

        /// <summary>
        /// 根据属性名取得值
        /// </summary>
        /// <param name="entity">泛型实体</param>
        /// <param name="propertyName">属性名</param>
        /// <returns>对应属性值</returns>
        public static string GetPropertyValue<T>(T entity, string propertyName) where T : class
        {
            var type = entity.GetType();
            var propertyInfo = type.GetProperty(propertyName);
            var value = (string)propertyInfo.GetValue(entity);
            return value;
        }
    }

    public class TableHeader
    {
        /// <summary>
        /// 表头宽度
        /// </summary>
        public string Width { get; set; }
        /// <summary>
        /// 表头名
        /// </summary>
        public string HeaderName { get; set; }
    }

类TableHeader可定义自己喜欢的位置,我定义在这里是为了方便,代码很清晰,相信很容易看懂。

最后新建一个控制器HomeController用于调用这些代码生成html表格:

public ActionResult Index()
        {
            string tableBody = CommonConfiguration.TableTdBody;
            StringBuilder sb = new StringBuilder();


            var tableList = new List<TableHeader>
            {
                new TableHeader { Width = "10", HeaderName = "Id" },
                new TableHeader { Width = "20", HeaderName = "CustomerGuid" },
                new TableHeader { Width = "30", HeaderName = "Username" },
                new TableHeader { Width = "40", HeaderName = "Email" },
                new TableHeader { Width = "50", HeaderName = "Password" },
                new TableHeader { Width = "60", HeaderName = "PasswordSalt" },
                new TableHeader { Width = "70", HeaderName = "Active" },
                new TableHeader { Width = "80", HeaderName = "Deleted" },
                new TableHeader { Width = "90", HeaderName = "LastIpAddress" },
                new TableHeader { Width = "100", HeaderName = "CreatedOn" },
            };

            var customers = _customerService.GetCustomers().ToArray();

            customers.ForEach(c =>
            {
                sb.AppendFormat("<tr class=\"{0}\">", c.Active ? "success" : "warning");
                sb.AppendFormat(tableBody, c.Id);
                sb.AppendFormat(tableBody, c.CustomerGuid);
                sb.AppendFormat(tableBody, c.Username);
                sb.AppendFormat(tableBody, c.Email);
                sb.AppendFormat(tableBody, c.Password);
                sb.AppendFormat(tableBody, c.PasswordSalt);
                sb.AppendFormat(tableBody, c.Active);
                sb.AppendFormat(tableBody, c.Deleted);
                sb.AppendFormat(tableBody, c.LastIpAddress);
                sb.AppendFormat(tableBody, c.CreatedOn.ToString("yyyy-MM-dd"));
                sb.Append("</tr>");
            });

            var htmlResult = CommonHelper.HtmlResult("border-color: solid 1px #008000", "table table-striped", sb.ToString(), tableList);

            ViewBag.Result = MvcHtmlString.Create(htmlResult);

            return View();
        }

视图页:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<div class="container">
    @ViewBag.Result
</div>

最后查看生成的html格式效果:

 

  <table style="border-color: solid 1px #008000" class="table table-striped">
   <tbody>
    <tr>
     <th style="width:10px;">Id</th>
     <th style="width:20px;">CustomerGuid</th>
     <th style="width:30px;">Username</th>
     <th style="width:40px;">Email</th>
     <th style="width:50px;">Password</th>
     <th style="width:60px;">PasswordSalt</th>
     <th style="width:70px;">Active</th>
     <th style="width:80px;">Deleted</th>
     <th style="width:90px;">LastIpAddress</th>
     <th style="width:100px;">CreatedOn</th>
    </tr>
    <tr class="success">
     <td>1</td>
     <td>bee62ba2-9d53-495f-80d4-af4fe6ddaa16</td>
     <td>Allen</td>
     <td>875755898@qq.com</td>
     <td>0D59DB9C0211A16786F5EFD6B5809B6984B2AF96</td>
     <td>TW0lAH4=</td>
     <td>True</td>
     <td>False</td>
     <td>127.0.0.1</td>
     <td>2016-06-18</td>
    </tr>
   </tbody>
  </table>

这里我用了bootstrap作为表格的样式,你们可自定义class。

 

--鱼头鱼尾

--QQ:875755898

posted @ 2016-08-03 22:18  鱼头鱼尾  阅读(7028)  评论(0编辑  收藏  举报
 >>>转载请注明出处<<<