首页 > 解决方案 > 获取 HttpReques 不包含 Form - Datatable 服务器端处理的定义

问题描述

我有以下服务器端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using AutoMapper;
using myProject.Models;
using System.Web.Http;
using MyProject.Dtos;

using System.Web.Mvc;
using System.Linq.Dynamic;
using System.Data.Entity;
public class MembersController: Controller 
{
     public MembersController()
        {
            _context = new ApplicationDbContext();

        }

public ActionResult GetMembers(string query = null)
        {
            try
            {
                //Creating instance of DatabaseContext class  
                using (_context)
                {
                    var draw = Request.Form.GetValues("draw").FirstOrDefault();
                    var start = Request.Form.GetValues("start").FirstOrDefault();
                    var length = Request.Form.GetValues("length").FirstOrDefault();



                    //Paging Size (10,20,50,100)    
                    int pageSize = length != null ? Convert.ToInt32(length) : 0;
                    int skip = start != null ? Convert.ToInt32(start) : 0;
                    int recordsTotal = 0;

                    // Getting all member data    
                    var membersQuery = _context.Members.ToList();



                    //total number of rows count     
                    recordsTotal = membersQuery.Count();
                    //Paging     
                    var data = membersQuery.Skip(skip).Take(pageSize).ToList();
                    ////Returning Json Data    
                    return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data });


                }
            }
            catch (Exception)
            {
                throw;
            }

        }

}

这是我的看法:

var table = $("#members").DataTable({
        "processing": true, // for show progress bar  
        "serverSide": true,
        "pageLength":5,

        ajax: {
            url: "/api/members",
            dataSrc: "",
            "type": "POST",
            "datatype": "json" 

        },

        columns: [
            {
                data: "cardNumber"
            },
            {
                data: "registrationDate",

            },
            {
                data: "fullName",

            },
            {
                data: "address"
            },
            {
                data: "phoneNumber"
            },
            {
                data: "email"
            }             
        ]
    });

我收到以下编译错误:

错误 CS1061 'HttpRequestMessage' 不包含 'Form' 的定义,并且找不到接受“HttpRequestMessage”类型的第一个参数的可访问扩展方法“Form”(您是否缺少 using 指令或程序集引用?)

错误 CS0029 无法将类型“System.Web.Http.Results.JsonResult<data>>”隐式转换为“System.Web.Mvc.ActionResult”

我正在关注教程以获得指导。

将感谢您的帮助

标签: c#jsonasp.net-mvcdatatables

解决方案


两条异常消息相互关联,并且似乎源自以下using可疑的声明:

using System.Web.Http;

这个url设置意味着你想从 DataTable 的 AJAX 回调中调用 Web API 控制器:

url: "/api/members", // points to Web API controller

发生第一个异常是因为您使用的Request属性不是源自HttpContext.Request该返回HttpRequest,而是来自命名空间中的另一个Request属性System.Web.Http返回HttpRequestMessage

发生第二个异常是因为控制器操作的返回类型是System.Web.Mvc.ActionResult,而您的Json()方法可能会返回System.Web.Http.Results.JsonResult这是 Web API 的一部分。

从您的 AJAX URL 和控制器操作来看,您有 2 个选项:

1)如果您使用的是MVC 控制器,请删除System.Web.Http命名空间并确保您使用RequestHttpContext.Current是以下示例:

var draw = HttpContext.Current.Request.Form.GetValues("draw").FirstOrDefault();
var start = HttpContext.Current.Request.Form.GetValues("start").FirstOrDefault();
var length = HttpContext.Current.Request.Form.GetValues("length").FirstOrDefault();

然后你需要替换 AJAX 调用DataTable来调用动作名称,如下所示:

ajax: {
    url: '@Url.Action("GetMember", "Members")',
    data: ..., // set your data here
    type: "POST",
    dataType: "json" 
},

2) 如果您使用的是Web API 控制器,请将System.Web.Mvc.Controller继承替换为System.Web.Http.ApiController,然后使用正确的方式从 Web API 控制器返回 JSON 字符串:

public class MembersController: ApiController 
{
    // ctor
    public MembersController()
    {
        _context = new ApplicationDbContext();

    }

    public IHttpActionResult GetMembers([FromBody] ViewModel model)
    {
        try
        {
            //Creating instance of DatabaseContext class  
            using (_context)
            {
                var draw = model.Draw;
                var start = model.Start;
                var length = model.Length;

                // skipped for brevity

                return Ok(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data });
            }
            catch (Exception)
            {
                // error handling
            }
        }
    }
}

如果您选择这种方法,您可以保持 URL不变,但应该修改/api/MembersAJAX 调用的data/dataSrc参数以传递 viewmodel 对象,因为来自 Web API 的属性没有属性作为其成员。DataTableRequestForm

相关问题:

POST 抛出 HttpRequestMessage 不包含 Form 的定义

无法将 Web.Http.Results.JsonResult 隐式转换为 Web.Mvc.JsonResult


推荐阅读