c# - 获取 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”
我正在关注本教程以获得指导。
将感谢您的帮助
解决方案
两条异常消息相互关联,并且似乎源自以下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
命名空间并确保您使用Request
的HttpContext.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/Members
AJAX 调用的data
/dataSrc
参数以传递 viewmodel 对象,因为来自 Web API 的属性没有属性作为其成员。DataTable
Request
Form
相关问题:
推荐阅读
- python - 合并 pandas 中的两个系列时间间隔(交集)
- python - 在 scikit-learn、keras、tensorflow 和 mxnet 中保存机器学习模型的所有格式是什么?
- unix - Bash Shell:通过更新学生的分数来更新文件中学生的顺序
- flutter - 如何使屏幕导航到其他屏幕从左到右开始
- json - Perl 处理后向 JSON 数据添加内容
- android - 尝试访问日志或打开监视器时 adb 卡住了
- angular - Spring Websocket 不适用于 ssl (wss)
- javascript - Realm.objects() 在 React Native 上返回空对象
- python - 使用pip时发生Tensorflow安装
- google-cloud-platform - auth0 和 Google Identity Platform 有什么区别?