我正在尝试创建一个快速的应用程序来尝试使用Web API学习AngularJS(我已经使用过ASP.NET MVC但没有机会使用Web API)服务器端,但我似乎无法得到我的对象发布Web API方法时序列化。
我的对象是一个简单的用户对象,它继承自BaseEntity对象:
public class User : BaseEntity
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>
/// The name.
/// </value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the email.
/// </summary>
/// <value>
/// The email.
/// </value>
public string Email { get; set; }
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>
/// The password.
/// </value>
public string Password { get; set; }
}
public class BaseEntity : MongoRepository.Entity, Interfaces.IEntity
{
/// <summary>
/// Gets or sets the id for this object (the primary record for an entity).
/// </summary>
/// <value>
/// The id for this object (the primary record for an entity).
/// </value>
public new int Id { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="BaseEntity"/> is selected.
/// </summary>
/// <value>
/// <c>true</c> if selected; otherwise, <c>false</c>.
/// </value>
public bool Selected { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="BaseEntity"/> is deleted.
/// </summary>
/// <value>
/// <c>true</c> if deleted; otherwise, <c>false</c>.
/// </value>
public bool Deleted { get; set; }
}
我的最新方法尝试如下:
public HttpResponseMessage Post(JObject user)
{
User userObject = user.ToObject<User>();
_Repo.Add(userObject);
return Request.CreateResponse(HttpStatusCode.Created, "User Created");
}
我的AngularJS片段清楚地说明了从UI发布的内容(属性是使用ng-model设置的,我可以看到它们是通过Fiddler传递的,即使这样,Web API方法也会将这些属性反序列化为null而不是比“”):
$scope.User = {
Name: '',
Password: '',
Email: '',
}
$scope.register = function () {
$http({
method: 'POST',
url: '/api/User/',
data: $scope.User //Also tried JSON.stringify($scope.User)
})
.success(function () {
//Handle successful registration
})
.error(function () {
//Show error message
});
}
调试时,我可以看到用户参数已填充了一个对象。我已经尝试在请求期间设置所有属性,只有一个属性等,并通过POSTman和应用程序调用api,我使用的方式,当我尝试将用户参数对象解析为User对象时,我得到一个空白的User对象。当我将参数类型作为我的User对象时,我也得到了相同的结果。
我环顾四周,大多数示例和回答的问题都没有继承任何东西,我尝试过不同的Content-Type认为它可能是问题(这是我有User对象类型和参数类型的时候法)。
当涉及到从其他类派生的对象时,是否存在我在Web API反序列化中缺少JSON.NET/built的怪癖,或者是否有我遗漏的内容?
编辑:我已经从我的对象中删除了所有继承,并且它按照我的预期绑定,所以我不确定为什么在有任何类型的继承时它不起作用。当对象从另一个对象继承时,是否需要一些设置才能使参数绑定工作?:public class User
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
答案 0 :(得分:1)
我认为WebAPI非常聪明,可以直接绑定到类型化对象。因此,该方法只需User
类型,而不是JObject
。
此外,请确保Javascript中的属性名称与模型的属性名称完全匹配。否则它会使传入的模型保持默认值,这对布尔人来说很危险!
可能是路由。不要忘记WebApi中的默认路由包括'/ api /'(“api / {controller} / {id}”),它在MVC中没有?
没有更多细节。这就是我所能说的。
答案 1 :(得分:0)
我终于设法解决了我的问题,但是我不知道为什么我需要这么做,因为我看到很多例子都不需要它!无论如何,我用以下属性装饰了我的User对象和BaseEntity:
[JsonObject(MemberSerialization.OptOut)]
这些对象可能存在于自己的类库中而不是在Models文件夹中吗?我不知道,但无论哪种方式似乎修复它,然后我可以将用户类型作为我的参数类型