Как конвертировать Получить запрос на публикацию запроса в WebApi? - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу изменить запрос GET в WebApi на запрос POST, потому что мне нужно отправить данные в теле почтового запроса.

Это в js:

    $scope.DS = new kendo.data.DataSource({
            type: "json",
            transport: {
                read: {
                    url: "/api/Employees/GetAllRecord",
                    dataType: "json",
                    contentType: "application/json",
                    type: "GET"
                },

Я изменил типбыть сообщением:

type: "POST", 

Следующее есть в webApi:

[WebInvoke(Method = "POST", UriTemplate = "Employees/GetAllRecord")]
    //[HttpPost] 
public IHttpActionResult GetAllRecord([FromBody] Models.DataSourceRequest request)
    {

            if (request != null)
            {
                var s = request;
            }
            var user = db.Users.Select(x => new RegisterBindingModel()
            {
                Id = x.Id,
                Email = x.Email,
                UserName = x.UserName,
                FirstName = x.FirstName,
                LastName = x.LastName,
                Age = x.Age,
            });

            var a = user.ToList();
            var b = Json(new { Data = a, Total = a.Count() });
            string strserialize = JsonConvert.SerializeObject(b.Content); // b.Content have json data
            //var c = JsonConvert.DeserializeObject<List<RegisterBindingModel>>(b.ToString());
            MyData c = JsonConvert.DeserializeObject<MyData>(strserialize);
            return Ok(c);
            //return user.ToList();
        }

Это RegisterModel:

public class RegisterBindingModel
{

    [Display(Name = "ID")]
    public int Id { get; set; }
    [Required]
    [Display(Name = "Email")]
    public string Email { get; set; }
    [Required]
    [Display(Name = "User Name")]
    public string UserName { get; set; }
    [Required]
    [Display(Name = "FirstName")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Lastname")]
    public string LastName { get; set; }
    [Required]
    [Display(Name = "Age")]
    public int Age { get; set; }
    }

И я столкнулся с ошибкой (см. Прикрепленное изображение) Итак, чтобы исправить это, я создаю новую модель следующим образом:

public class MyData
{
    public List<RegisterBindingModel> Data { get; set; }
    public int Total { get; set; }
}

Я запустил проект и из Fiddler я заметил, что запрос вызывается дважды:

Первый вызов как / api / Employees , в котором есть все записи.

Второй вызов как / api / Employees / GetAllRecord , у которого 400 неверных запросов и сообщение об ошибке:

Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.ICollection`1 [Project.Models.RegisterBindingModel]', поскольку для типа требуется массив JSON (например, [1,2,3]) для правильной десериализации.Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например,массив или список), которые можно десериализовать из объекта JSON.JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON.Путь '', строка 1, позиция 2.

Вот формат strserialize:

 {
"Data": [{
    "Id": 1,
    "Email": "Test@gmail.com",
    "UserName": "Test",
    "FirstName": "Test",
    "LastName": "Test",
    "Age": 23,
    "Phone": 1234560987
}],
"Total": 13
   }

Теперь, как я могу это исправить?

Ипожалуйста, кто-нибудь может сказать мне, почему Webapi выполняется дважды?Это нормально ?Или я что-то не так сделал?

ОБНОВЛЕНИЕ Я думаю, что я должен сделать это из внешнего интерфейса, я попробовал следующее:

       parameterMap: function (options, operation) {
                    debugger;

                    if (operation !== "read" && options.models) {
                        console.log(JSON.stringify(options.models));
                        return JSON.stringify(options.models);
                    }
                    else {
       //  var filters = JsonConvert.SerializeObject(options);
                        var a = angular.fromJson(options)
                        return JSON.stringify(a);

enter image description here

1 Ответ

0 голосов
/ 30 апреля 2019

Используйте следующую модель:

public class RegisterBindingModel
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public int Phone { get; set; }
}

public class MyData
{
    public List<RegisterBindingModel> Data { get; set; }
    public int Total { get; set; }
}

А затем десериализовать ваши данные как:

MyData c = JsonConvert.DeserializeObject<MyData>(strserialize);

Рабочий пример: https://dotnetfiddle.net/IEqpxc

...