0

*已回答!问题底部的解决方案 *

嗨,我开始玩弄 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 使一切都像魅力一样工作。

谢谢一群人。

4

1 回答 1

0

首先,尝试在播放中的 HTTP 动词之后命名您的操作,即,PostLogin而不是Login. 如果这不起作用,或者尝试添加[FromBody]到您的操作参数:

public PostLoginResponse Login([FromBody]PostLoginModel model)
于 2013-11-04T22:00:11.920 回答