*已回答!问题底部的解决方案 *
嗨,我开始玩弄 MVC 4,但我很快就碰壁了。注意:我将 Newtonsoft.JSON 用于所有与 JSON 相关的内容。
我正在尝试将一个 json 发布到我的控制器,看起来像这样(在提琴手中):
POST http://localhost:10187/api/Account/Login/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:10187
Content-Length: 63
ContentType: "application/json"
{
"username" : "blahblah",
"password" : "mypassw0rd"
}
这是我的控制器:
public class AccountController : ApiController
{
[HttpPost]
public PostLoginResponse Login(PostLoginModel model)
{
return new PostLoginResponse()
{
Status = model.Username,
Token = model.Password
};
}
}
这是使用的两个模型:
public class PostLoginModel
{
[JsonProperty(PropertyName = "username")]
[Required(ErrorMessage = "Username is required")]
public string Username { get; set; }
[JsonProperty(PropertyName = "password")]
[Required(ErrorMessage = "Password is required")]
public string Password { get; set; }
}
public class PostLoginResponse
{
[JsonProperty(PropertyName = "status")]
public string Status { get; set; }
[JsonProperty(PropertyName = "token")]
public string Token { get; set; }
}
现在似乎发生的是,我的控制器似乎没有将在我的请求中发送的 JSON 正文转换为 PostLoginRequest。如果我签入我的控制器 if (model == null) 始终为真。
我在这里想念什么?我试图阅读模型绑定但无法获得任何工作。如果我将 return 语句替换为使用如下字符串:
return new PostLoginResponse()
{
Status = "Hahaha",
Token = "It WORKS!"
};
它完美无缺。任何指针或帮助都会有所帮助。
@更新:
试过:
[HttpPost]
public PostLoginResponse Post([FromBody]PostLoginModel model)
{
if (model == null)
{
Console.WriteLine("It's null");
}
if (!ModelState.IsValid)
{
Console.WriteLine("It's invalid");
}
return new PostLoginResponse()
{
Status = model.Username,
Token = model.Password
};
}
而且我遇到了同样的错误。该模型似乎为空,但它是有效的。我得到它是空的,但不是它是无效的。并尝试将“application/json”和 application/json 作为 contenttype 都没有成功(在两种情况下都会发生同样的事情)
@Update 2:搞砸我...感谢 haim770 让我查看内容类型标题。这是内容类型而不是内容类型!
将标头更改为 Content-Type: application/json 使一切都像魅力一样工作。
谢谢一群人。