MVC控制器POST不适用于自定义参数

时间:2013-11-04 21:17:58

标签: asp.net-mvc json asp.net-mvc-4

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

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

谢谢一群人。

1 个答案:

答案 0 :(得分:0)

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

public PostLoginResponse Login([FromBody]PostLoginModel model)