我是Asp.net MVC Core的新手。我正在使用Asp.Net Core MVC中间件在服务器端加载JQuery Datatables.net。
我已经使用this教程来学习如何创建处理程序,然后在this文章中介绍了如何迁移到中间件,但是遇到了一些问题,希望对您有所帮助。
我使用this教程进行了优化
我收到错误
“ InvalidOperationException:错误的内容类型:Microsoft.AspNetCore.Http.Features.FormFeature.ReadForm()”
运行解决方案时。
这是我的代码: 查看
<script type="text/javascript">
$(document).ready(function () {
$('#datatable').DataTable({
//"paging": true,
//"ordering": true,
//"info": true,
'columns' : [
{ 'data': 'InsertedDateUtc' },
//{ 'data': 'EventId' },
{ 'data': 'UserId' },
{ 'data': 'Action' },
{ 'data': 'Context' },
{ 'data': 'RecordId' },
{ 'data': 'Property' },
{ 'data': 'OldValue' },
{ 'data': 'NewValue' },
],
'processing': true,
'serverSide': true,
'ajax' : {
'type' : 'POST',
'url' : '../AuditEventData.cs',
//'url': '../APIController/GetAuditEvents'
//'url' : '@Url.Action("GetAuditEvents", "APIController")'
'datatype': 'json',
}
});
});
</script>
中间件
public class AuditEventData
{
private readonly RequestDelegate _next;
private readonly IDataGet _dataGet;
public AuditEventData(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
string result = null;
int filteredCount = 0;
var draw = httpContext.Request.Form["draw"].FirstOrDefault();
var start = int.Parse(httpContext.Request.Form["start"].FirstOrDefault());
var length = int.Parse(httpContext.Request.Form["length"].FirstOrDefault());
var sortCol = int.Parse(httpContext.Request.Form["columns[" + httpContext.Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault());
var sortDir = httpContext.Request.Form["order[0][dir]"].FirstOrDefault();
var search = httpContext.Request.Form["search[value]"].FirstOrDefault();
try
{
var auditEvents = await _dataGet.GetServerSideAuditEvents(length, start, sortCol, sortDir, search);
filteredCount = auditEvents.Count();
var data = new
{
iTotalRecords = await _dataGet.GetTotalAuditEventCount(),
iTotalDisplayRecords = filteredCount,
aaData = auditEvents
};
result = JsonConvert.SerializeObject(data);
await httpContext.Response.WriteAsync(result);
}
catch (Exception e)
{
await ErrorHandler.HandleException(e);
}
await _next(httpContext);
}
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseAuditEventDataMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AuditEventData>();
}
}
Startup.cs
app.MapWhen(
context => context.Request.Path.ToString().EndsWith("ViewAudit"),
appBranch =>
{
appBranch.UseAuditEventDataMiddleware();
});
在中间件类中的行
var start = int.Parse(httpContext.Request.Form [“ start”]。FirstOrDefault());
给我错误-教程和Microsoft文档here似乎表明我不需要使用“ .Form”,应该可以使用
var start = int.Parse(httpContext.Request [“ start”]。FirstOrDefault());
但是,当我这样做时,会出现此错误
不能将[]的索引应用于类型为'HttpRequest'的表达式
我找不到任何有关此操作的示例,我们将不胜感激
谢谢
答案 0 :(得分:0)
为了期望在Form
中包含HttpContext.Request
,您必须将ajax
datatype
更改为'application/x-www-form-urlencoded'
。现在,是否要这样做是另一个问题。
从这里:https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data