【问题标题】:Ajax Post Request always passes null Object to MVC ControllerAjax 发布请求总是将空对象传递给 MVC 控制器
【发布时间】:2017-04-20 02:24:09
【问题描述】:

我正在尝试使用 JQuery ajax post 来调用 ASP.Net 核心控制器。 我尝试了所有不同的场景,但其中任何一个都不起作用。这是我的 Javascript 函数:

   $("#verify-answer").click(function () {

        if ($("#question_answer").val() != "") {
            var request = JSON.stringify({
                'Answer': $('#question_answer').val(),
                'UserId': 1,
                'TenantId': 0
            });

            $.ajax({
                url: "/Account/PasswordRecoveryChallengResponseGetToken",
                type: "POST",             
                contentType: 'application/json',
                data: request,
                datatype: "json",
                success: function (result) {

                    console.log("answer token challenge: ");

                },
                error: function (result) {                      
                }
            });
        }

        return false;
    });

部分视图 HTML:

 <div>
     <form>
         <p>Challenge-Response Option</p>
          <label for="username">Username</label>
          <input type="text" class="form-control" id="username_recovery">
          <button type="submit"  id="get-questions" onclick="return false;" >Retrieve Question</button>
      </form>
  </div>


 <div id="question">
    <div>                      
       <form>
            <div id="user_question"> </div>
            <label for="username">Answer</label>
            <input type="text" id="question_answer">
            <div  id="questions_answer_message"></div>
            <button type="submit"  id="verify-answer">Verify Answer</button>
        </form>
     /div>
  </div>

这是我的控制器:

[HttpPost]
public async Task<IActionResult> PasswordRecoveryChallengResponseGetToken(ResetPasswordQuesionChallengeRequest request)
{

}

模型通过:

public class ResetPasswordQuesionChallengeRequest : Core.TenantClientEntityBase
{

    [Required]
    public string Answer { get; set; }
}


 public abstract class TenantClientEntityBase
{
    [Required]
    public int TenantId { get; set; }

    [Required]
    public int UserId { get; set; }
}

这是请求负载:

请求参数始终具有以下值:

  • 答案 = 空
  • 用户 ID = 0
  • TenantId = 0

我做错了什么?

【问题讨论】:

  • 您能否检查开发者工具的网络选项卡 (F12) 并验证请求负载是否符合预期?
  • 这是请求负载:{Answer: "test", UserId: 1, TenantId: 0}

标签: jquery json asp.net-core asp.net-core-mvc


【解决方案1】:

我发现我必须将 [FromBody] 放在我所有的帖子中,否则我会遇到同样的问题。

例如

public async Task<IActionResult> PasswordRecoveryChallengResponseGetToken([FromBody] ResetPasswordQuesionChallengeRequest request)

【讨论】:

  • 谢谢!你知道这背后的原因吗?
  • 当您从多个来源获取数据时它会很有用,例如
  • 例如更新(Guid id,[FromBody] UpdateData 数据),但我不确定为什么它在 POST 上默认不假定 FromBody...
  • @holland1991:原因之一可能是 WebAPI 和 MVC 合并到一个框架中。以前,MVC 和 WebApi 会继承自不同的基类。现在只有一个类(或者根本没有),将模型传递给控制器​​有两种主要方式:正文中的 json/xml(WebApi 的典型)或表单请求(MVC 的典型)
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2018-11-18
  • 2015-09-03
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多