*的回答!问题底部的解决方案*
嗨,我开始玩MVC 4了,我很快就碰壁了。 注意:我正在使用Newtonsoft.JSON来处理所有与JSON相关的内容。
我正在尝试将json发布到我看起来像这样的控制器(在fiddler中):
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。如果我检查我的控制器是否(模型== null)始终为真。
我在这里缺少什么?我试过阅读模型绑定但无法正常工作。如果我将return语句替换为使用如下字符串:
return new PostLoginResponse()
{
Status = "Hahaha",
Token = "It WORKS!"
};
它完美无瑕。 任何指针或帮助都会有所帮助。
@Update:
试过:
[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
};
}
我得到了同样的错误。似乎模型为null但它是有效的。 我得到的它是空的但不是它的无效。尝试使用“application / json”和application / json作为内容类型但没有成功(两种情况都会发生相同的事情)
@Update 2: 拧我...感谢haim770让我看看内容类型的标题。 它的内容类型不是ContentType!
将标题更改为Content-Type:application / json使一切都像魅力一样。
谢谢一群人。
答案 0 :(得分:0)
首先,尝试在播放HTTP动词后命名您的操作,即PostLogin
而不是Login
。如果这不起作用,或者尝试将[FromBody]
添加到您的操作参数:
public PostLoginResponse Login([FromBody]PostLoginModel model)