我必须在 ASP.NET Core Web API 中显示数据表。
这是我的代码。
控制器:
[Route("api/[controller]")]
[ApiController]
public class MapDataTableDemo : ControllerBase
{
Product p;
public MapDataTableDemo()
{
p = new Product();
}
[HttpGet]
public async Task<IActionResult> MapDataTable()
{
var response = p.GetDataTable();
return Ok(response);
}
}
产品型号类别:
public class Product
{
public DataTable dataTable { get; set; }
public DataTable GetDataTable()
{
this.dataTable = new DataTable();
this.dataTable.Columns.Add("product name");
this.dataTable.Columns.Add("product price");
this.dataTable.Rows.Add("mobile", 20000);
this.dataTable.Rows.Add("tv", 15000);
this.dataTable.Rows.Add("washing machine", 30000);
return this.dataTable;
}
}
当我调试API时,我可以看到响应,但无法显示数据表。
我收到错误如下:
错误:响应状态为 500
响应正文
System.NotSupportedException:不支持“System.Type”实例的序列化和反序列化。路径:$.Columns.DataType.
System.NotSupportedException:不支持“System.Type”实例的序列化和反序列化。
在 System.Text.Json.Serialization.Converters.UnsupportedTypeConverter
1.TryWrite(Utf8JsonWriter writer,T&值,JsonSerializerOptions选项,WriteStack&状态)1.Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) at System.Text.Json.Serialization.JsonConverter
在 System.Text.Json.Serialization.Metadata.JsonPropertyInfo1.OnTryWrite(Utf8JsonWriter writer,T 值,JsonSerializerOptions 选项,WriteStack& 状态)1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter
在 System.Text.Json.Serialization.JsonConverter1.TryWriteAsObject(Utf8JsonWriter writer,对象值,JsonSerializerOptions 选项,WriteStack& 状态)1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.Serialization.JsonConverter
在 System.Text.Json.Serialization.JsonConverter1.OnWriteResume(Utf8JsonWriter writer,TCollection 值,JsonSerializerOptions 选项,WriteStack& 状态)1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.Serialization.Converters.IEnumerableConverter
在 System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryWrite(Utf8JsonWriter writer,TCollection 值,JsonSerializerOptions 选项,WriteStack& 状态)
有什么解决办法吗?
谢谢!
安装
Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet 包。
在Program.cs中添加这行代码:
builder.Services.AddControllers().AddNewtonsoftJson();
它对我有用。
在使用 ASP.NET Core 和 DataTables 时,尝试在没有传统 MVC 控制器的情况下实现服务器端处理时可能会遇到问题。此解决方案说明了如何在 ASP.NET Core 项目中直接将 DataTables 与 Razor Pages 集成,解决 Ajax 请求和处理服务器端数据处理等常见问题。
问题
尝试在不使用控制器的情况下在 Razor Pages 中设置数据表时会出现挑战。常见问题包括:
解决方案
这是使用 Razor Pages 实现 DataTable 的分步指南,包括如何正确配置 Ajax 和服务器端处理。
在 Razor 页面中创建一个表,该表将由 DataTables** 填充。您可以添加用于添加、编辑或删除记录等操作的按钮:
@page
@model YourApp.Pages.Vehicules.IndexModel
<div class="toolbar chrome-style-toolbar mb-3">
<button onclick="OnNew()" type="button" class="btn btn-chrome-style" data-bs-toggle="modal" data-bs-target="#newWindow">
<i class="fas fa-plus"></i> New
</button>
<button onclick="OnEdit()" id="editButton" type="button" class="btn btn-chrome-style" data-bs-toggle="modal" data-bs-target="#editWindow">
<i class="fas fa-edit"></i> Edit
</button>
<button id="deleteButton" type="button" class="btn btn-chrome-style" data-bs-toggle="modal" data-bs-target="#confirmationModal">
<i class="fas fa-trash"></i> Delete
</button>
</div>
<div class="container">
<div class="table-responsive">
<table id="maindatatable" class="table table-bordered">
<thead>
<tr>
<th>UID</th>
<th>License Plate</th>
<th>Brand</th>
<th>Chassis Number</th>
<th>Client</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
@section Scripts {
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/datatables/js/jquery.dataTables.min.js"></script>
<script src="~/js/vehicules.js"></script>
}
在 JavaScript 文件 (
vehicules.js
) 中,初始化 DataTables 并将其指向获取数据以进行服务器端处理的 API:
$(document).ready(function () {
$('#maindatatable').DataTable({
ajax: {
url: "/api/Vehicules/GetVehiculeList", // The API that serves the data
type: "POST"
},
processing: true,
serverSide: true,
filter: true,
columns: [
{ "data": "uid", name: "UID", "visible": false },
{ "data": "matricule", name: "License Plate" },
{ "data": "marque", name: "Brand" },
{ "data": "numeroChassis", name: "Chassis Number" },
{ "data": "client", name: "Client" }
]
});
});
创建一个控制器来处理服务器端请求。该逻辑将管理分页、排序、搜索,并以 DataTables 期望的格式发回数据。
[Route("api/[controller]")]
[ApiController]
public class VehiculesController : ControllerBase
{
private readonly WebDbContext _context;
public VehiculesController(WebDbContext context)
{
_context = context;
}
[HttpPost("GetVehiculeList")]
public IActionResult GetVehiculeList()
{
var draw = Request.Form["draw"].FirstOrDefault();
var sortColumn = Request.Form["columns[" + Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault();
var sortColumnDirection = Request.Form["order[0][dir]"].FirstOrDefault();
var searchValue = Request.Form["search[value]"].FirstOrDefault();
int pageSize = Convert.ToInt32(Request.Form["length"].FirstOrDefault() ?? "0");
int skip = Convert.ToInt32(Request.Form["start"].FirstOrDefault() ?? "0");
// Base query
var query = _context.Vehicules
.Include(v => v.Client)
.Include(v => v.Marque)
.AsQueryable();
// Apply search filter
if (!string.IsNullOrEmpty(searchValue))
{
query = query.Where(x => x.Matricule.ToLower().Contains(searchValue.ToLower()) ||
x.NumeroChassis.ToLower().Contains(searchValue.ToLower()) ||
x.Client.Nom.ToLower().Contains(searchValue.ToLower()) ||
x.Marque.Libelle.ToLower().Contains(searchValue.ToLower()));
}
// Get total records count before pagination
var totalRecords = query.Count();
// Apply sorting if needed
if (!string.IsNullOrEmpty(sortColumn) && !string.IsNullOrEmpty(sortColumnDirection))
{
if (sortColumnDirection == "asc")
query = query.OrderBy(x => EF.Property<object>(x, sortColumn));
else
query = query.OrderByDescending(x => EF.Property<object>(x, sortColumn));
}
// Apply pagination
var vehicules = query.Skip(skip).Take(pageSize)
.Select(v => new
{
UID = v.UID,
Matricule = v.Matricule,
Marque = v.Marque.Libelle,
NumeroChassis = v.NumeroChassis,
Client = v.Client.Nom,
DateCreate = v.DateCreate,
DateUpdate = v.DateUpdate
})
.ToList();
// Return data in format DataTables expects
var returnObj = new
{
draw = draw,
recordsTotal = totalRecords,
recordsFiltered = totalRecords, // Implement custom filter logic if needed
data = vehicules
};
return Ok(returnObj);
}
}
serverSide: true
以启用服务器端处理。ajax
URL 指向以 JSON 格式返回数据的正确 API 端点。为什么这个解决方案有效
此设置可确保 DataTables 正确初始化并从 ASP.NET Core API 检索其数据。控制器以 DataTables 期望的格式返回数据,包括分页、排序和搜索功能。此结构还允许您根据应用程序的需要轻松集成其他操作(例如创建、编辑和删除记录)。
常见问题和修复
此方法解决了 DataTables 和 ASP.NET Core Razor Pages 的常见问题,并且应该为面临类似问题的其他人提供指导。