【问题标题】:Can't post Model via ajax无法通过 ajax 发布模型
【发布时间】:2018-08-24 09:21:02
【问题描述】:

我正在使用 Ajax 制作模型并将其发送到控制器。

这是模型:

 public class PersonDto{
        public Guid Id { get; set; }
        public int PersonAge { get; set; }
        public string PersonName { get; set; }
        public DateTime? DateCreated { get; set; }
    }

这里是控制器:

[Route("EditPerson")]
[HttpPost]
public async Task<IActionResult> EditPerson(PersonDto offer) {
  //Save to Entity FW
}

这里是阿贾克斯:

var data = {
    Id: $('#personModal #personModalTitle').text(),
    PersonAge: $('#personModal #personId').val(),
    PersonName: $('#personModal #personName').val()
};

var dataJson = JSON.stringify(data);
console.log(dataJson);

$.ajax({
    type: 'POST',
    url: 'Persons/EditPerson',
    data: dataJson,
    contentType: "application/json",
    success: function (result) {

    },
    error: function (error) {
        Alert("Error Saving offer changes!");
    }
});

这是控制台日志 (Json),一切看起来都很棒:

{"Id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","PersonAge":"5","PersonName":"John"}

当我 调试 PersonsController 我看到我的模型从未填充,不为空,只是其中没有数据。

我尝试在 Ajax 函数中将 DateCreated 添加到模型中,我尝试将 Age 解析为 int。

我尝试在 Action 中将 [FromBody] 注释添加到 PersonDto,然后将 NULL 添加到我的模型中。

我不知道我可以在哪里出错。

【问题讨论】:

  • InstallerIdPersonDto poco 中不存在。
  • 默认情况下,aspnet 核心需要驼峰式属性(除非您配置您的 api 以接受其他方式)。因此它可能期待{ "id": ..., "personAge":..., "personName":...} 而不是{ "Id": ..., "PersonAge":..., "PersonName":...}
  • @DanielShillcock 我改变了,我从不同的答案复制了 ajax 并改变了它。这是我的代码中的 ajax。
  • @gerryc.inc 我更改了,结果相同:现在是 Json:{"id":"2e454721-99c5-47b7-abfa-f2e410cccaaa","personAge":"57"," personName":"约翰雪"}
  • 我复制了你的代码,当我执行camelCase 属性时,它可以工作,在操作参数上使用[FromBody] 属性,并在我的请求中设置'Accept': 'applicaiton/json' 标头。

标签: c# asp.net-core


【解决方案1】:

对于 JSON 编码的正文,只需添加 [FromBody]

    [Route("EditPerson")]
    [HttpPost]
    public async Task<IActionResult> EditPerson([FromBody] PersonDto offer)
    {
        return new JsonResult(offer);
    }

更新:

  1. 另一种方法是使用[ApiController] 来装饰控制器类。

  2. 如果没有 [ApiController] ,则应添加 [FromBody] 以强制模型绑定器从正文中读取。

  3. camelCased 或 pascalCased 有效载荷是否重要。没什么区别。

骆驼案:

POST https://localhost:44372/api/values/EditPerson HTTP/1.1 
Content-Type : application/json

{"id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","personAge":"5","personName":"John"}

帕斯卡案例:

POST https://localhost:44372/api/values/EditPerson HTTP/1.1 
Content-Type : application/json

{"Id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","PersonAge":"5","PersonName":"John"}

【讨论】:

  • 这就是将它与来自 cmets 的@gerryc.inc 答案结合起来的答案:默认情况下,aspnet 核心需要驼峰式属性!如果没有 camelCased 属性,它将无法与 [FromBody] 注释一起使用。我已经试过了。
  • 这到底是如何工作的? FromBody 旨在根据this 用于简单类型
  • @AleksandarGas ,实际上,如果客户端发布有效载荷 {"Id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","PersonAge":"5","PersonName":"John"} ,它也会起作用。
  • @Hintham , [FromBody] 将强制模型绑定器从 body 读取。 在 MVC 中,简单类型是任何 .NET 原始类型或带有字符串类型转换器的类型,请参阅docs.microsoft.com/en-us/aspnet/core/mvc/models/…
【解决方案2】:

您能否尝试将您的数据作为 JObject

[FromBody] JObject 报价

[Route("EditPerson")]
[HttpPost]
public async Task<IActionResult> EditPerson([FromBody] JObject offer) {
    string Id = (string)form.SelectToken("Id")
    string PersonAge= (string)form.SelectToken("PersonAge")
    string PersonName= (string)form.SelectToken("PersonName")
}

【讨论】:

    【解决方案3】:

    正如我从您的代码中看到的那样,您没有发送变量,即您期望的变量“offer”。 在进行 AJAX 调用和发送数据时,数据参数应命名为您所期望的。

    您应该以这种格式发送数据:

    { 
      offer: { PersonAge: 10, PersonName: 'Senad' } 
    }
    

    你的电话应该是这样的

    var data = {
        Id: $('#personModal #personModalTitle').text(),
        PersonAge: $('#personModal #personId').val(),
        PersonName: $('#personModal #personName').val()
    };
    
    $.ajax({
        type: 'POST',
        url: 'Persons/EditPerson',
        data: { offer: data }, //no need to serialize it
        dataType: 'json',
        success: function (result) {
    
        },
        error: function (error) {
            Alert("Error Saving offer changes!");
        }
    });
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2019-07-17
      • 1970-01-01
      • 2018-02-03
      • 2015-02-20
      相关资源
      最近更新 更多