Я хочу изменить запрос 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);