json POST 上使用 AJAX 的 MVC 操作方法的字符串为空

json string on POST to MVC action method using AJAX is null

我很难找出为什么通过 AJAX 请求发送的字符串为空。 Console.WriteLine(data) 显示为空。状态为 200 正常。如果我添加一些代码来解析收到的字符串,我会收到一条错误消息,指出 JObject.Parse 不能为空。我不知道我错过了什么。 javascript 代码没问题。 action方法貌似还可以,但是我对Asp.Net Core和MVC的了解非常匮乏,所以不太确定。有人可以指出我遗漏了什么吗?

javascript代码:


    let obj = {email: email_address.value};
    let objStringified = JSON.stringify(obj);
    $.ajax({
       type: 'POST',
       contentType: 'application/json; charset=UTF-8',
       data: objStringified,
       url: '@Url.Action("ReturnCheckAccountDuplication")',
       dataType: 'text',
       success: function(data) {
          console.log(data);
       },
       error: function(error) {
          console.log("Keep trying", error);
       }
    });

C#代码:

[HttpPost]
public ActionResult ReturnCheckAccountDuplication([FromBody] string data)
{
   Console.WriteLine(data);
   JObject jObject = JObject.Parse(data);
   string email = (string)jObject["email"];
   bool emailExists = CheckAccountDuplication.Get(email);
   string returnResult = emailExists.ToString();
   return Content(returnResult);
}

控制器端的解决方案是

public class AccountCheckModel
{
   public string Email { get; set; }
}

[HttpPost]
public ActionResult ReturnCheckAccountDuplication([FromBody] AccountCheckModel data)
{
   string result = CheckAccountDuplication.Get(data.Email).ToString();
   return Content(result);
}

感谢所有评论我的问题的成员,特别是提供解决方案的 John Glenn。我已经尝试了几天但没有成功。我对 Asp.Net Core 的了解确实很差。非常感谢。

最简单的解决方案是创建一个模型来表示您的控制器将接收的 JSON 数据。例如,像这样创建一个 class:

public class AccountCheckModel
{
    public string email { get; set }
}

然后,将其用作控制器方法的参数:

public ActionResult ReturnCheckAccountDuplication([FromBody] AccountCheckModel data)

这是访问请求正文的首选方式。要将请求正文作为字符串获取,您必须跳过一些 serious hoops.

通过 AJAX 将数据发送到 Controller 的另一种方法:

var json = {
       email: email_address.value
};

$.ajax({
   type: 'POST',
   data: {'json': JSON.stringify(json)},
   url: '@Url.Action("ReturnCheckAccountDuplication")',
   dataType: 'json',
   success: function(data) {
      console.log(data);
   },
   error: function(error) {
      console.log("Keep trying", error);
   }
});

还有你的Controller

[HttpPost]
public ActionResult ReturnCheckAccountDuplication(string json)
{
   Console.WriteLine(json);
   JObject jObject = JObject.Parse(json);
   string email = (string)jObject["email"];
   bool emailExists = CheckAccountDuplication.Get(email);
   string returnResult = emailExists.ToString();
   return Content(returnResult);
}