I have a jQuery DataTable with server-side processing which is giving me circular dependency issue.
I have to list a field `Administrator` in my DataTable that belongs to another class. If I include it in the code, I get dependency errors with Ajax like
> DataTables warning: table id=datatableServer-Ajax error.
Is there a way to fix this issue?
What I have tried:
**Department class**
public class Department
{
public int DepartmentID { get; set; }
[StringLength(50, MinimumLength = 3)]
public string Name { get; set; }
[DataType(DataType.Currency)]
[Column(TypeName = "money")]
public decimal Budget { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Start Date")]
public DateTime StartDate { get; set; }
[Display(Name = "Administrator")]
public int? InstructorID { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
public virtual Instructor Administrator { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
**Instructor**
public class Instructor : Person
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Hire Date")]
public DateTime HireDate { get; set; }
public virtual ICollection<Course> Courses { get; set; }
public virtual OfficeAssignment OfficeAssignment { get; set; }
}
**Controller**
public ActionResult DataHandler([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestModel)
{
IQueryable<Department> query;
using (SchoolContext db = new SchoolContext())
{
query = db.Departments;
var totalCount = query.Count();
if (requestModel.Search.Value != string.Empty)
{
var value = requestModel.Search.Value.Trim();
query = query.Where(p => p.Name.Contains(value)
}
var filteredCount = query.Count();
var sortedColumns = requestModel.Columns.GetSortedColumns();
var orderByString = String.Empty;
foreach (var column in sortedColumns)
{
orderByString += orderByString != String.Empty ? "," : "";
orderByString += (column.Data) +
(column.SortDirection ==
Column.OrderDirection.Ascendant ? " asc" : " desc");
}
query = query.OrderBy(orderByString ==
string.Empty ? "BarCode asc" : orderByString);
query = query.Skip(requestModel.Start).Take(requestModel.Length);
var data = query.Select(a => new
{
Name = a.Name,
Budget = a.Budget,
StartDate = a.StartDate,
}).ToList();
return Json(new DataTablesResponse
(requestModel.Draw, data, filteredCount, totalCount),
JsonRequestBehavior.AllowGet);
}
}
**Script**
$(document).ready(function () {
$('#datatable').dataTable();
var departmentsList;
$(function () {
departmentsList = {
dt: null,
init: function () {
dt = $('#datatableServer').DataTable({
"serverSide": true,
"processing": true,
"ajax": {
"url":
"@Url.Action("DataHandler","Department")"
},
"columns": [
{ "data": "Name",
"searchable": true },
{ "data": "Budget",
"searchable": true },
{ "data": "StartDate",
"searchable": true }
],
"lengthMenu": [[10, 25, 50, 100], [10, 25, 50, 100]],
});
}
}
departmentsList.init();
});
});