【问题标题】:Web API model binding not workingWeb API 模型绑定不起作用
【发布时间】:2020-11-05 05:41:02
【问题描述】:

为什么默认情况下 Web API 模型绑定如此复杂: 我尝试了很多组合,但它们似乎都不起作用。 这是 ajax 请求:

var dataString = JSON.stringify({
            request: Request
        });
var request = Request;
$.ajax({
        type: "POST",
        data: '='+dataString,
        // contentType: 'application/x-www-form-urlencoded',
        contentType: "application/json; charset=utf-8",
        dataType: "json",

这是控制器:

public AccResultObject Post(string jezik, string page, string size, string sort,AccRequestViewModel model)

这是 AccRequestViewModel

public class AccRequestViewModel
{
    public AccRequestObject request { get; set; }
}

这是 AccRequestObject:

public class AccRequestObject
    {

        public int FM { get; set; }
        public int Budget { get; set; }
        public string WebCatID { get; set; }


        public int Distance { get; set; }
    }

无论我做什么,控制器都会得到空值。

我也试过这个。这似乎很合乎逻辑:

 var dataString = JSON.stringify({
            request: Request
         });
 $.ajax({
        type: "POST",
        data: dataString, ...

控制器接收 AccRequestObject:

  public AccResultObject Post(string jezik, string page, string size, string sort,[FromBody] AccRequestObjectmodel)

除了这个小问题,它工作得很好。值未绑定。

【问题讨论】:

  • 被字符串化的“请求”的结构是什么?您也不需要在 ajax 调用的数据部分添加“=”。
  • 我发现我需要在WEB API中添加'='
  • 你不应该这样做,因为你在活页夹中得到空值,可能会尝试删除它:-) 请提供你试图发布的 json,因为没有它很难确定问题

标签: asp.net-web-api model-binding


【解决方案1】:

确保您在 javascript 中创建的每个对象的属性与代码模型完全匹配。如果某个属性名在代码模型中是大写的,那么在js中也需要大写。除此之外,使用 jquery 将模型发布到 Web Api 控制器非常简单:

//code model
public class MyModel{
    public int MyProperty{get;set;}     
}

//js
$.ajax({
        contentType: "application/json",
        dataType: 'json',
        url: 'http://api/to/my/controller',
        data: JSON.stringify({MyProperty: 1}),
        type: "POST"
    });

【讨论】:

  • 我们可以避免在 js 中使用大写字母吗?设置 jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();不起作用。
  • @MilenKovachev 我想你可以自己写:newtonsoft.com/json/help/html/…
【解决方案2】:

在 C# 中,确保您的属性是公开的 properties,而不是 fields

public class MyBindingModel
{
    public string myProp{ get; set; }
}

【讨论】:

  • 它们也需要公开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多