У меня есть представление с помощью JQuery DataTable, которое загружает его содержимое через AJAX, вызывая метод действия (обработка на стороне сервера), который возвращает красивую строку JSON со всеми данными.
Я делаю следующее:
- Я создаю список, который содержит данные для DataTable. Каждая строка в таблице является строковым массивом, потому что это требование для DataTables.
- Я поместил все данные для DataTable в анонимный объект. Эти данные состоят из количества строк, данных (список) и некоторых других вещей.
- Из этого анонимного объекта создается строка JSON, поэтому все данные возвращаются в формате JSON
- Происходит какое-то волшебство, и данные отображаются в моей таблице данных.
Проблема в том, что я не могу вывести HTML, потому что Razor автоматически избегает этого. Я уже пробовал такие вещи, как Html.Raw, new HtmlString () и тому подобное, но проблема в том, что я ДОЛЖЕН поместить строки HTML в мою коллекцию List, потому что DataTables не может обрабатывать любые другие типы, насколько мне известно.
DataTable в моем представлении не содержит никакого определения того, какие столбцы должны быть отображены, это делается автоматически, просто просматривая мою строку JSON (с Javascript или чем-то еще) и отображая ее (снова, с Javascript).
Таким образом, вопрос заключается в следующем: как я могу отобразить HTML в моем DataTable при использовании обработки на стороне сервера MVC3?
Кстати, код:
<table id="datatable">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Destination address</th>
<th>Platform</th>
<th> </th>
<th> </th>
</tr>
</thead>
<tbody id="tabledata">
<!-- Content will be rendered here by AJAX -->
</tbody>
<tfoot>
<tr>
<th>Id</th>
<th>Name</th>
<th>Destination address</th>
<th>Platform</th>
<th> </th>
<th> </th>
</tr>
</tfoot>
</table>
И обработка на стороне сервера:
public JsonResult List()
{
List<PushApplication> pushApplications = _service.GetData(Request).ToList();
int totalRecords = _service.GetApplicationCount();
// Reformat the data.
List<string[]> aaData = new List<string[]>(pushApplications.Count);
aaData.AddRange(pushApplications.Select(application => new[]
{
application.Id.ToString(),
application.Name,
application.DestinationAddress,
application.Platform,
"<a href='/PushApplication/Edit/" + application.Id + "'>Modify</a>",
"<a href='/PushApplication/Delete/" + application.Id + "'>Delete</a>"
}));
// Construct anonymous object for the data table.
var data = new { sEcho = Request.QueryString["sEcho"], iTotalRecords = totalRecords, iTotalDisplayRecords = totalRecords, aaData = aaData };
return Json(data, JsonRequestBehavior.AllowGet);
}
Я вызываю данные со следующим битом Javascript:
$(document).ready(function () {
var oTable = $('#datatable').dataTable({
"bPaginate": true,
"bLengthChange": true,
"bFilter": true,
"bSort": true,
"bInfo": true,
"bAutoWidth": false,
"bProcessing": true,
"bServerSide": true,
"bJQueryUI": true,
"iDisplayStart": 0,
"sEcho": 1,
"sDom": 'T<"clear"><"top"fi>rt<"bottom"pl><"clear">',
"sAjaxSource": '/PushApplication/List',
"sPaginationType": "full_numbers",
"fnServerData": fnDataTablesPipeline,
"oTableTools": {
"sSwfPath": "/Plugins/TableTools/swf/copy_cvs_xls_pdf.swf"
},
"aoColumns": [
{ sWidth: '10%' },
{ sWidth: '30%' },
{ sWidth: '30%' },
{ sWidth: '30%' }
]
});
$("#submitForm").click(function () {
oTable.fnDraw();
});
});