У меня есть следующий код на стороне сервера:
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"
}
]
});
Я получаю следующие ошибки компиляции:
Error CS1061 'HttpRequestMessage' does not contain a definition for 'Form' and no accessible extension method 'Form' accepting a first argument of type 'HttpRequestMessage' could be found (are you missing a using directive or an assembly reference?)
Error CS0029 Cannot implicitly convert type 'System.Web.Http.Results.JsonResult< data>>' to 'System.Web.Mvc.ActionResult'
Я следую учебнику это для руководства.
Будем признательны за вашу помощь





Оба сообщения об исключениях связаны друг с другом и, похоже, возникли из этого утверждения using, которое было подозрительным:
using System.Web.Http;
И этот параметр url, который подразумевает, что вы хотите вызвать контроллер веб-API из обратного вызова AJAX DataTable:
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, который является частью веб-API.
Судя по вашему URL-адресу AJAX и действию контроллера, у вас есть 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) Если вы используете Контроллер веб-API, замените наследование System.Web.Mvc.Controller на System.Web.Http.ApiController, а затем используйте правильный способ возврата строки JSON из контроллера веб-API:
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 как есть, но параметр data/dataSrc вызова AJAX из DataTable следует изменить, чтобы передать объект модели представления, потому что свойство Request из веб-API не имеет свойства Form в качестве своего члена.
Связанные вопросы:
POST бросает HttpRequestMessage не содержит определения для формы
Не удается неявно преобразовать Web.Http.Results.JsonResult в Web.Mvc.JsonResult.
Привет @Tetsuya, спасибо за ваши идеи. Я выбрал вариант 1 (Контроллер MVC), и когда я начал отлаживать, я получил следующее исключение в самой первой строке, где он пытается прочитать значение «draw». Вот что я получил: значение не может быть нулевым. Имя параметра: источник