Asp.net mvc 4 ASP.Net Web Api未在POST上绑定模型

Asp.net mvc 4 ASP.Net Web Api未在POST上绑定模型,asp.net-mvc-4,asp.net-web-api,model-binding,modelbinders,Asp.net Mvc 4,Asp.net Web Api,Model Binding,Modelbinders,我试图将JSON数据发布到Web Api方法,但JSON数据没有绑定到模型 这是我的模型: [DataContract] public class RegisterDataModel { [DataMember(IsRequired = true)] public String SiteKey { get; set; } [DataMember(IsRequired = true)] public String UserId { get; set; }

我试图将JSON数据发布到Web Api方法,但JSON数据没有绑定到模型

这是我的模型:

[DataContract]
public class RegisterDataModel
{
    [DataMember(IsRequired = true)]
    public String SiteKey { get; set; }

    [DataMember(IsRequired = true)]
    public String UserId { get; set; }

    [DataMember(IsRequired = true)]
    public String UserName { get; set; }
}
以下是我的Web Api操作:

    public class RegisterController : ApiController
    {
    public Guid Post([ModelBinder] RegisterDataModel registerDataModel)
    {
        if (!ModelState.IsValid)
        {
            throw new ModelStateApiException(ModelState);
        }
        var userProfileDataContract = userProfileBusinessLibrary.GetNewOne();
        userProfileDataContract.UserId = registerDataModel.UserId;
        userProfileDataContract.UserName = registerDataModel.UserName;

        var userKey = userProfileBusinessLibrary.Register(registerDataModel.SiteKey, userProfileDataContract);

        return userKey;
    }
    }
在添加[ModelBinder]之前,registerDataModel为null。添加[ModelBinder]后,registerDataModel是registerDataModel实例,但所有属性值均为null

以下是我通过Fiddler提出的请求:

http://local.testwebsite.com/api/register

Request Headers:
User-Agent: Fiddler
Host: local.testwebsite.com
Content-Length: 89
Content-Type: application/json; charset=utf-8:

Request Body:
{ 
 "SiteKey":"qwerty",
 "UserId": "12345qwerty", 
 "UserName":"john q"
}    

要使post数据绑定到RegisterDataModel属性,我缺少什么?谢谢您的帮助。

您是如何创建JSON请求的?通过Fiddler请求生成器?在请求主体中尝试以下操作

{ 
 "SiteKey":"qwerty",
 "UserId": "12345qwerty", 
 "UserName":"john q"
}

我猜“请求体”也是请求体的一部分。删除并检查。

与OP的问题无关,而是问题的标题 当我使用(公共)字段而不是属性时,将我带到了这里 在模型类中(即no
{get;set;}
)。 事实证明,这也会导致绑定失败


可能对某人有所帮助。

在我的例子中,应用程序的请求在转发到我的.NET Web API之前通过一个名为“API管理器”的中间件进行身份验证/授权。POST参数未绑定,因为出于某种原因,我不知道为什么“内容长度”是从标头发出的。原因是,默认的JsonMediaTypeFormatter在进行模型绑定之前总是检查请求的内容长度,如果未显示内容长度,则会将参数设置为NULL。

您可能只需要控制器操作上的
[Post]
属性。感谢您的回复,但添加[HttpPost]没有帮助。我对WebApi的理解是,您不需要http谓词属性,因为ASP.net MVC使用将谓词与控制器操作匹配的约定。我使用Fiddler的composer将json数据提交给我的web api。这里是一个屏幕截图:如果我只是删除[ModelBinder],它对我来说非常适合。我只是复制粘贴了你的代码并进行了测试。我在这里看到的一个区别是,你的内容长度是89。对于完全相同的有效载荷,我的是64。这就是为什么我猜你会发送一些额外的东西,比如“请求主体:”,哦,顺便说一句,utf-8内容类型旁边有一个额外的冒号或分号:application/json;charset=utf-8:删除该选项,然后重试。这是[ModelBinder]和“:”输入错误的组合。谢谢你的帮助。我遇到了完全相同的问题,添加一个get和set解决了这个问题。这对我也有帮助。很高兴看到它没有被删除,它肯定属于这个问题的标题,即使OP已经有了属性。这对我很有帮助。谢谢!