Получение HttpReques не содержит определения для формы — обработка данных на стороне сервера

У меня есть следующий код на стороне сервера:

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'

Я следую учебнику это для руководства.

Будем признательны за вашу помощь

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 197
1

Ответы 1

Оба сообщения об исключениях связаны друг с другом и, похоже, возникли из этого утверждения 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». Вот что я получил: значение не может быть нулевым. Имя параметра: источник

mcfred 27.03.2019 17:35

Другие вопросы по теме