2015-03-30 74 views
0

Web API Post parameters are always NullMVC4的Web API之后的参数空

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); 
}); 

Controller类

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

Creds类

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方法中的User对象public void Post([FromBody]User user)

我在这里错过了什么?

+1

不知道它是否适用于Web的API,但肯定会失败MVC,因为你没有为'Creds' – 2015-03-30 23:32:34

+0

@StephenMuecke感谢您的答复参数的构造函数!我将设置一个,但在我原来的文章中,我提到我也有一个用户类,它的设置完全一样,并且工作正常。另外,我不确定这是否能解释为什么我的后参数为空? – fischgeek 2015-03-30 23:35:45

+0

@StephenMuecke圣洁的废话!我道歉我不相信你。我扔了一个只是为了看到,它的工作!谢谢! – fischgeek 2015-03-30 23:40:44

回答

0

尝试用下面的修改后的代码:

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); 
}); 

Controller类:

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

Creds类:

不变。

+0

对不起,不行。这正是StephenMuecke所建议的。感谢您的回复! – fischgeek 2015-03-31 01:03:14

0

按照下面的代码

的Web API Controller类

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

Creds类

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(); 
0

@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

0

您不必创建一个模式,以多交的参数。您可以使用动态对象。

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