Web API - 无法反序列化请求对象

时间:2015-05-12 10:07:18

标签: json angularjs asp.net-web-api

我正在尝试创建一个快速的应用程序来尝试使用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; }

}

2 个答案:

答案 0 :(得分:1)

我认为WebAPI非常聪明,可以直接绑定到类型化对象。因此,该方法只需User类型,而不是JObject

此外,请确保Javascript中的属性名称与模型的属性名称完全匹配。否则它会使传入的模型保持默认值,这对布尔人来说很危险!

可能是路由。不要忘记WebApi中的默认路由包括'/ api /'(“api / {controller} / {id}”),它在MVC中没有?

没有更多细节。这就是我所能说的。

答案 1 :(得分:0)

我终于设法解决了我的问题,但是我不知道为什么我需要这么做,因为我看到很多例子都不需要它!无论如何,我用以下属性装饰了我的User对象和BaseEntity:

[JsonObject(MemberSerialization.OptOut)]

这些对象可能存在于自己的类库中而不是在Models文件夹中吗?我不知道,但无论哪种方式似乎修复它,然后我可以将用户类型作为我的参数类型