DataTables слабо типизированы.Я ненавижу слабую печать.
Вот альтернативный подход: использование моделей представлений, строго типизированных представлений и шаблонов отображения.Итак, начните с определения модели представления, которая будет представлять информацию, которую вы хотите отобразить:
public class MyViewModel
{
public IEnumerable<ColumnViewModel> Columns { get; set; }
public IEnumerable<RowViewModel> Rows { get; set; }
}
public class ColumnViewModel
{
public string Name { get; set; }
}
public class RowViewModel
{
public IEnumerable<CellValueViewModel> Values { get; set; }
}
public class CellValueViewModel
{
public string Value { get; set; }
}
, тогда у вас может быть действие контроллера, которое заполнит эту модель представления.Если у вас уже есть несколько сервисных слоев, которые плюют в DataTables, вы можете сопоставить эти таблицы с вышеупомянутой моделью представления.Для этой демонстрации давайте жестко закодировать:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Columns = new[]
{
new ColumnViewModel { Name = "column1" },
new ColumnViewModel { Name = "column2" },
new ColumnViewModel { Name = "column3" },
},
Rows = new[]
{
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "1x1" },
new CellValueViewModel { Value = "1x2" },
new CellValueViewModel { Value = "1x3" },
}
},
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "2x1" },
new CellValueViewModel { Value = "2x2" },
new CellValueViewModel { Value = "2x3" },
}
},
new RowViewModel
{
Values = new[]
{
new CellValueViewModel { Value = "3x1" },
new CellValueViewModel { Value = "3x2" },
new CellValueViewModel { Value = "3x3" },
}
}
}
};
return View(model);
}
}
, а последняя часть - это представление (~/Views/Home/Index.cshtml
):
@model MyViewModel
<table>
<thead>
<tr>
@Html.DisplayFor(x => x.Columns)
</tr>
</thead>
<tbody>
@Html.DisplayFor(x => x.Rows)
</tbody>
</table>
и наши шаблоны отображения:
~/Views/Home/DisplayTemplates/ColumnViewModel.cshtml
:
@model ColumnViewModel
<th>
@Html.DisplayFor(x => x.Name)
</th>
~/Views/Home/DisplayTemplates/RowViewModel.cshtml
:
@model RowViewModel
<tr>
@Html.DisplayFor(x => x.Values)
</tr>
~/Views/Home/DisplayTemplates/CellValueViewModel.cshtml
:
@model CellValueViewModel
<td>
@Html.DisplayFor(x => x.Value)
</td>
И это почти все.Как вы можете видеть, мы написали ровно ноль циклов в наших представлениях, и мы получили красивую структуру <table>
, представляющую таблицу Excel.