簡體   English   中英

ASP.NET 核心 - [FromBody] 的奇怪行為

[英]ASP.NET Core - weird behavior with [FromBody]

我有一個 ASP.NET Core web 應用程序可以正常工作,當使用這個 controller 實現時:

[HttpPost]
public ActionResult SetAssignment()
{
    string b = "";

    using (StreamReader rdr = new StreamReader(Request.Body)) b = rdr.ReadToEnd();
    Assignment asg = JsonConvert.DeserializeObject<Assignment>(b);

    // asg is valid here

    // ... do other stuff ...
}

但是在使用這個實現時它不起作用:

[HttpPost]
public ActionResult SetAssignment([FromBody] Assignment asg)
{
    // asg is always NULL here

    // ... do other stuff...
}

從理論上講,這些實現應該是相同的(盡管第二個會更優雅),不是嗎?

我好像錯過了什么……

調用此方法的方式如下所示,順便說一句:

function asgupdate() {
   var asp = {};
   asp.AssignmentId = $("#asp_idx").val();
   ...
        
   $.ajax({
      type: "POST",
      url: "/Project/SetAssignment",
      data: JSON.stringify(asp),
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function (r) {
          ...
      }
   });
};

JSON 請求確實由瀏覽器發送,並且看起來正確(afaict)。

分配 model 如下所示:

  public class Assignment
    {
        [Key]
        public int AssignmentId { get; set; }
        [Required]
        public int CrewMemberId { get; set; }
        [Required]
        public int ProjectId { get; set; }
        [DisplayName("Function")]
        public string Function { get; set; } = "";
        public string? Account { get; set; }
        public float Rate { get; set; } = 0;
        public float PrepWeeks { get; set; } = 0;
        public float ShootWeeks { get; set; } = 0;
        public float WrapWeeks { get; set; } = 0;
        public float PostWeeks { get; set; } = 0;
        public DateTime Created { get; set; } = DateTime.UtcNow;
        public DateTime Updated { get; set; } = DateTime.UtcNow;
        public AssignmentTypes? AssignmentType { get; set; } = AdditionalClasses.AssignmentTypes.SALARYNORMAL;
        public virtual CrewMember CrewMember { get; set; }
        public virtual Project? Project { get; set; }
     }

好的,解決方案是幾件事的混合,感謝@dbc 為我指明了正確的方向......

  1. 我錯誤地認為自動 JSON 轉換與 Newtonsoft.JSON 相同,這絕對不是。

  2. 由於 System.Text.Json 在解釋內容方面更加嚴格,我不得不添加一些選項:

builder.Services.AddControllers().AddJsonOptions(x =>
    {
        x.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
        x.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
    });
  1. 由於枚舉也有不同的處理方式(NumberHandling 選項不適用於枚舉解析,因此我不得不更改生成 JavaScript 以始終發送 integer 而不是字符串。我嘗試使用 JsonSerializerEnumOptions.Converters.Add(new JsonString)但是,這破壞了枚舉的發回(因為它現在會將枚舉的字符串名稱而不是 integer 值發送回無法處理的 webfrontend)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM