2015-03-30 47 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]; 
}