InvalidOperationException:错误的内容类型:Microsoft.AspNetCore.Http.Features.FormFeature.ReadForm()

时间:2019-01-02 23:37:03

标签: asp.net-mvc datatables

我是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'的表达式

我找不到任何有关此操作的示例,我们将不胜感激

谢谢

1 个答案:

答案 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