Asp.net mvc 4 ASP.Net Web Api未在POST上绑定模型
我试图将JSON数据发布到Web Api方法,但JSON数据没有绑定到模型 这是我的模型: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; }
[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已经有了属性。这对我很有帮助。谢谢!