【问题标题】:JQuery ajax post parameters null in controller控制器中的JQuery ajax发布参数为空
【发布时间】:2021-03-03 09:02:08
【问题描述】:

我有一个 ajax POST 请求:

$.ajax({
    url: "/api/EmmaWeb/SaveFavourite", //window.location.pathname + "?handler=favourite", //"/it/Umbria/vocabolo-menicaglie-6?handler=favourite",
    type: "POST",
    headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]', $form).val() },
    //contentType: "application/jsonrequest; charset=utf-8",
    //contentType: 'application/json',
    //dataType: "json",
    data: JSON.stringify({ isFavourite: $inputIsFavourite.val().toLowerCase(), propertyUnitSlug: $PropertyUnitSlug.val() }),
    cache: false
}).done(function (resp) {
    console.log("done", resp);
});

我的控制器

[ApiController]
[Route("/api/[controller]")]
public class EmmaWebController : Controller
{
    [HttpPost]
    [Route("[action]")]
    public async Task<IActionResult> SaveFavouriteAsync(bool isFavourite, string propertyUnitSlug)
    {
        // DO Something

        return new JsonResult(new
        {
            // Something
        });
    }
}

我在控制器中执行了我的操作,但参数始终为空。我尝试添加 [FromBody] 但我收到 415 错误

【问题讨论】:

  • 请留下一个帖子,描述您为解决问题所做的工作。请不要使用此信息编辑问题。您可以将自己的帖子标记为答案,因此请使用标准方式关闭此主题。

标签: .net ajax post controller


【解决方案1】:

FromBodyAttribute 只能使用一次,因为它使用了整个请求正文。

有几种解决方法可以解决这个问题:

使用包装器class

public class SaveFavouriteRequest 
{
   public bool IsFavourite { get; set; }
   public string PropertyUnitSlug { get; set; }
}
public async Task<IActionResult> SaveFavouriteAsync([FromBody]SaveFavouriteRequest requestData)
{
   var x = requestData.IsFavourite;
}

使用JObject

public async Task<IActionResult> SaveFavouriteAsync([FromBody]JObject requestData)
{
   var x = requestData["isFavourite"].ToObject<bool>();
}

使用dynamic

public async Task<IActionResult> SaveFavouriteAsync([FromBody]dynamic requestData)
{
   var x = JsonConvert.DeserializeObject<bool>(requestData.isFavourite.ToString());
}

ToString() 可能需要.ToLower()


没有FromBody 的替代方案

Request.Body 上使用JObject.ParseStreamReader

public async Task<IActionResult> SaveFavouriteAsync()
{
    using var reader = new StreamReader(Request.Body, Encoding.UTF8);
    var requestBody = await reader.ReadToEndAsync();
    var requestData = JObject.Parse(requestBody);
    var x = JsonConvert.DeserializeObject<bool>(requestData["isFavourite"].ToString().ToLower());
}

Request.Body 上使用JObject.LoadAsyncJsonTextReader

public async Task<IActionResult> SaveFavouriteAsync()
{
    using var reader = new HttpRequestStreamReader(Request.Body, Encoding.UTF8);
    using var jsonReader = new JsonTextReader(reader);
    var requestData = await JObject.LoadAsync(jsonReader);
    var x = JsonConvert.DeserializeObject<bool>(requestData["isFavourite"].ToString().ToLower());
}

【讨论】:

  • 我尝试了你所有的解决方案,但都不起作用
  • 能否详细说明不起作用
  • 参数始终为空。例如对于 warpper 类,模型不为空,但属性的值为空
  • @zOwN 你在用 Newtonsoft Json.NET 吗?
【解决方案2】:

我解决了从 Controller 中删除 [ApiController] 属性的问题,这是 ajax:

$.ajax({
    url: "/api/EmmaWeb/SaveFavourite", //window.location.pathname + "?handler=favourite", //"/it/Umbria/vocabolo-menicaglie-6?handler=favourite",
    type: "POST",
    headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]', $form).val() },
    //contentType: "application/jsonrequest; charset=utf-8",
    //dataType: "json",
    //contentType: 'application/json',        
    //dataType: "json",
    data: { "isFavourite": $inputIsFavourite.val(), "propertyUnitSlug": $PropertyUnitSlug.val() },
    cache: false
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多