我想将WebApi中的GET请求更改为POST请求,因为我需要在发布请求的正文中发送数据。
这是在js中:
$scope.DS = new kendo.data.DataSource({
type: "json",
transport: {
read: {
url: "/api/Employees/GetAllRecord",
dataType: "json",
contentType: "application/json",
type: "GET"
},
我将类型更改为Post:
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);
答案 0 :(得分:0)
使用以下模型:
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);