---
### Features
- Mini (DLL Size Only 20KB) and Easy to use.
- Support .NET Standard 2.0/.NET 4.6/.NET 4.5/.NET 4.0
- Without Any Third Party Library
- Support Anonymous Types,Dapper Dynamic Query,List/Array/Set/Enumrable,DataTable,Dictionary
### Installation
You can install the package [from NuGet](https://www.nuget.org/packages/HtmlTableHelper) using the Visual Studio Package Manager or NuGet UI:
```cmd
PM> install-package HtmlTableHelper
```
or the `dotnet` command line:
```cmd
dotnet add package HtmlTableHelper
```
### Fiddle Demo:
- [HtmlTableHelper ConsoleDemo](https://dotnetfiddle.net/DzddCl)
- [HtmlTableHelper ASP.NET MVC Demo (JQuery DataTable)](https://dotnetfiddle.net/u9Ia6M)
### Get Start
##### List/Array/Set/Enumrable non Key/Value Type Example
```C#
using HtmlTableHelper;
..
var sourceData = new[] { new { Name = "ITWeiHan", Age = "25",Gender = "M" } };
var tablehtml = sourceData.ToHtmlTable();
/*
Result:
Name
Age
Gender
ITWeiHan
25
M
*/
```
##### Dapper Example
```C#
using (var cn = "Your Connection")
{
var sourceData = cn.Query(@"select 'ITWeiHan' Name,25 Age,'M' Gender");
var tablehtml = sourceData.ToHtmlTable();
}
```
##### Dictionary Example
```C#
var sourceData = new[] {new Dictionary (){{"Name" , "ITWeiHan" },{"Age",25},{"Gender","M"}}};
var tablehtml = sourceData.ToHtmlTable();
```
**Custom Table/TR/TD/TH Attributes (Dynamic Type)**
```C#
var data = /*List/Array/Set/Enumrable..*/;
var html = data.ToHtmlTable( tableAttributes: new { @class = "SomeClass"} //this is dynamic type, support all attribute
,trAttributes: new { ID = "SomeID" },tdAttributes: new { width = "120 px" },thAttributes: new { @class = "dark-theme" }
);
/*
Result:
..
..
*/
```
##### Attribute Annotation
###### 1. Display :
```C#
public class ModelClassWithDisplayAttr
{
[TableColumn(DisplayName = "Column1")] //MyProperty1 property will render thead-td's innertext : "Column1"
public string MyProperty1 { get; set; }
[TableColumn(DisplayName = "Column2")] //MyProperty2 property will render thead-td's innertext : "Column2"
public string MyProperty2 { get; set; }
}
```
###### 2. Skip :
```C#
public class ModelClassWithSkipAttr
{
[TableColumn( Skip = true)]
public string MyProperty1 { get; set; } //MyProperty1 will not render html
public string MyProperty2 { get; set; }
}
```
##### HTMLTableBuilder
###### HtmlCaption
```C#
var soucreData = new []{ new {MyProperty1="test",MyProperty2=123} };
var html = soucreData.CreateBuilder()
.SetCaption("This is Caption", new { id = "CaptionId" })
.ToHtmlTable();
//Result :
This is Caption
MyProperty1
MyProperty2
test
123
```
##### HTMLTableSetting
Configurable InnerHtml Encoding (Recommended not to do so without a specific reason,because XSS Attack)
```C#
var sourceData = new[] { new { Name = "ITWeiHan" } };
//Default Encoding
var encodinghtml = sourceData.ToHtmlTable();
//Result:
..<b>ITWeiHan</b>..
var htmltablesetting = new HTMLTableSetting()
{
IsHtmlEncodeMode = false
};
var notEncodinghtml = sourceData.ToHtmlTable(HTMLTableSetting: htmltablesetting);
//Result:
..ITWeiHan..
```
### Extension
**ASP.NET Core MVC:**
Create a IHtmlHelperExtension.cs
```C#
using System.Collections.Generic;
using HtmlTableHelper;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Html;
public static class IHtmlHelperExtension
{
public static HtmlString ToHtmlTable(this IHtmlHelper htmlHelper, IEnumerable enums
, object tableAttributes = null, object trAttributes = null, object tdAttributes = null
, HtmlTableSetting HTMLTableSetting = null)
{
var html = enums.ToHtmlTable(tableAttributes, trAttributes, tdAttributes, HTMLTableSetting);
return new HtmlString(html);
}
public static HtmlString ToHtmlTable(this IHtmlHelper htmlHelper, System.Data.DataTable datatable
, object tableAttributes = null, object trAttributes = null, object tdAttributes = null
, HtmlTableSetting HTMLTableSetting = null)
{
var html = datatable.ToHtmlTable(tableAttributes, trAttributes, tdAttributes, HTMLTableSetting);
return new HtmlString(html);
}
}
```
razor.cshtml
```C#
@Html.ToHtmlTable(new[] { new { Name = "ITWeiHan", Age = "25", Gender = "M" } })
/*
Result:
Name
Age
Gender
ITWeiHan
25
M
*/
```
**ASP.NET MVC 5:**
Create a HtmlHelperExtension.cs
```C#
using System.Collections.Generic;
using HtmlTableHelper;
using System.Web;
using System.Web.Mvc;
public static class HtmlHelperExtension
{
public static HtmlString ToHtmlTable(this HtmlHelper htmlHelper, IEnumerable enums
, object tableAttributes = null, object trAttributes = null, object tdAttributes = null
, HtmlTableSetting HTMLTableSetting = null)
{
var html = enums.ToHtmlTable(tableAttributes, trAttributes, tdAttributes, HTMLTableSetting);
return new HtmlString(html);
}
public static HtmlString ToHtmlTable(this HtmlHelper htmlHelper, System.Data.DataTable datatable
, object tableAttributes = null, object trAttributes = null, object tdAttributes = null
, HtmlTableSetting HTMLTableSetting = null)
{
var html = datatable.ToHtmlTable(tableAttributes, trAttributes, tdAttributes, HTMLTableSetting);
return new HtmlString(html);
}
}
```
### Demo
**ASP.NET MVC 5 JQuery DataTable Demo:**
```C#
using HtmlTableHelper;
//..
public class HomeController : Controller
{
public ActionResult Index()
{
var datas = new[] { new { Name = "ITWeiHan", Age = "25",Gender = "M" } };
ViewBag.Table = datas.ToHtmlTable();
return View();
}
}
```
```C#
@{
Layout = null;
}
AspNetMvcDemo
@Html.Raw(ViewBag.Table)
```
**ASP.NET Core Demo:**
```C#
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async (context) =>
{
var sourceData = new[] { new { Name = "ITWeiHan", Age = "25",Gender = "M" } };
var tablehtml = sourceData.ToHtmlTable();
await context.Response.WriteAsync(tablehtml);
});
}
}
```