【问题标题】:MVC4 Web API Post Parameter NullMVC4 Web API 后参数 Null
【发布时间】:2015-03-30 23:25:44
【问题描述】:

Web API Post parameters are always Null

ASP.NET Web API POST parameter is null

对这些人有效的方法似乎对我无效。我的设置几乎完全相同,但在我的第二个控制器中仍然为空。第一个工作正常,但我无法在第二个控制器中复制它。

API 调用

$.ajax
({
    type: "POST",
    url: "http://localhost:52441/api/login",
    data: { "Username": "test", "Password": "ptest" }
})
.done(function (data) {
    //var json = $.parseJSON(data);
    console.log(data);
});

控制器类

public class LoginController : ApiController
{
    public bool Post([FromBody]Creds creds)
    {
        return false;
    }
}

学分类

public class Creds
{
    public string Username { get; set; }
    public string Password { get; set; }

    public Creds(string user, string pass)
    {
        this.Username = user;
        this.Password = pass;
    }
}

就像我说的,这在另一个控制器 (UsersController) 中工作。当我通过 { "First_Name": "John", "Last_Name": "Doe" } 时,我在 Post 方法 public void Post([FromBody]User user) 中正确接收了一个用户对象@

我在这里错过了什么?

【问题讨论】:

  • 不确定它是否适用于 web-api,但对于 mvc 肯定会失败,因为您没有 Creds 的无参数构造函数
  • @StephenMuecke 感谢您的回复!我会设置一个,但在我原来的帖子中,我提到我也有一个 User 类,它的设置完全相同,并且可以正常工作。另外,我不确定这是否可以解释为什么我的帖子参数为空?
  • @StephenMuecke 天哪!我很抱歉我不相信你。我扔了一个只是为了看看,它起作用了!谢谢!

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api


【解决方案1】:

试试下面修改后的代码:

API 调用:

$.ajax
({
    type: "POST",
    url: "http://localhost:52441/api/login/validate",
    data: { "Username": "test", "Password": "ptest" }
})
.done(function (data) {
    //var json = $.parseJSON(data);
    console.log(data);
});

控制器类:

public class LoginController : ApiController
{
    [HttpPost]
    public bool Validate(Creds creds)
    {
        return false;
    }
}

信用等级:

不变。

【讨论】:

  • 抱歉,不说了。这是斯蒂芬穆克建议的。感谢您的回复!
【解决方案2】:

遵循以下代码

网络 API 控制器类

   public class LoginController : ApiController
        {
            public bool Validate([FromUri]Creds creds)
            {
                return false;
            }
        }

学分类

public class Creds
{
    public string Username { get; set; }
    public string Password { get; set; }

    public Creds(string user, string pass)
    {
        this.Username = user;
        this.Password = pass;
    }
}

通过以下方式使用 API Ajax 调用

var RequestZipCode = { Username: "test", Password: "ptest" };
            $.ajax({
                type: "GET",
                data: Creds,
                url: "api/Name of the Controller/",
                contentType: "application/json",
                success: function (data){
                    ShowData(data);
            }
            });

创建一个将通过以下方式调用 webapi 的客户端应用程序

StringBuilder sbAPIRequest = new StringBuilder();
 sbAPIRequest.Append("?Username=test");
                sbAPIRequest.Append("&Password=ptest");

                HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(sbAPIRequest.ToString());

                httpWReq.Method = "GET";
                httpWReq.ContentType = "application/json;charset=UTF-8";
                httpWReq.ContentLength = 0;

                HttpWebResponse Httpresponse = (HttpWebResponse)httpWReq.GetResponse();
                string responseString = new StreamReader(Httpresponse.GetResponseStream()).ReadToEnd();

【讨论】:

    【解决方案3】:

    @StephenMuecke 为我提供了正确答案。这是因为我的类有一个无参数的构造函数。

    我需要对我的 Creds 课程这样做

    public class Creds
    {
        public string Username { get; set; }
        public string Password { get; set; }
    
        public Creds()
        {
            this.Username = string.Empty;
            this.Password = string.Empty;
        }
    
        public Creds(string user, string pass)
        {
            this.Username = user;
            this.Password = pass;
        }
    }
    

    非常感谢@StephenMuecke

    【讨论】:

      【解决方案4】:

      您不必创建模型来获取多个后置参数。您可以改用动态对象。

      [HttpPost]
      public SomeObject GetSomeObject([FromBody] dynamic postData) {
          var a = postData.[property name];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        相关资源
        最近更新 更多