2015-05-12 6 views
0

Я пытаюсь создать быстрое приложение, чтобы попытаться изучить AngularJS с помощью Web API (я работал с ASP.NET MVC, но не имел возможности использовать Web API) на стороне сервера, но я не могу заставить свой объект сериализоваться при публикации метода 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 фрагмент кода для некоторой ясности в отношении того, что опубликованные в пользовательском интерфейсе (свойства задаются с использованием ng-модели, и я вижу, что они передаются через Fiddler, даже если метод Web API де-сериализует эти свойства до нулевого, а не «):

 $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 
      }); 
    } 

При отладке я могу видеть, что пользовательский параметр был заполнен объектом. Я попытался установить все свойства во время запроса, только одно свойство и т. Д. И вызвал api через POSTman и приложение, которое когда-либо использовал, я получаю пустой объект User, когда пытаюсь разобрать объект пользовательского параметра на свой объект User , Я также получаю то же самое, когда я ставил тип параметра в качестве объекта User.

Я огляделся, и большинство примеров и ответы на вопросы не наследуются ни от чего, и я пробовал использовать разные типы Content-Type, это может быть проблема (это было, когда у меня был тип объекта User и тип параметра для метод).

Есть ли причуда, которую я отсутствую в JSON.NET/built в десериализации веб-API, когда дело доходит до объектов, полученных из других классов, или есть что-то, чего я не вижу?

EDIT: Я удалил все наследование с моего объекта, и он связывается, как я ожидаю, поэтому я не уверен, почему он не работает, когда есть какое-либо наследование. Есть некоторые настройки, необходимые для получения параметров привязки к работе, когда объект наследует от другого ?:

public class User 
{ 
    public string Name { get; set; } 

    public string Email { get; set; } 

    public string Password { get; set; } 

} 

ответ

0

Наконец-то мне удалось найти ответ на мою проблему, но я не уверен, зачем мне это нужно, когда столько примеров, которые я видел, не требуют этого! Во всяком случае, я украсил свой объект пользователя и BaseEntity со следующим атрибутом:

[JsonObject(MemberSerialization.OptOut)] 

Может быть, что эти объекты живут в своей собственной библиотеке классов, а не в папке Models?Я не знаю, но в любом случае, это, кажется, исправить, и я могу затем ввести тип пользователя как мой тип параметра

1

Я thik WebAPI достаточно умен, чтобы связываться непосредственно с типизированным объектом. Таким образом, метод может принимать только тип User, а не JObject.

Кроме того, убедитесь, что имена свойств в Javascript точно совпадают с именами свойств вашей модели. Или же это приведет к гидратации модели, пройденной со значениями по умолчанию, опасными для булевых!

Это может быть маршрутизация. Не забывайте, что маршрут по умолчанию в WebApi включает '/ api /' ("api/{controller}/{id}"), чего нет в MVC?

Без дополнительной информации. Это все, что я могу сказать.

+0

Спасибо за ваши комментарии, я попробовал его с помощью параметра метода веб-API в качестве объекта пользователя напрямую , но все же закончил с пустым объектом, поэтому изменил его на JObject, чтобы убедиться, что я получаю данные, как ожидалось. Я изменил свой исходный вопрос с помощью объекта области AngularJS, который я передаю –

+0

Если вы используете HTTP-службу напрямую, вам нужно будет установить заголовок 'content-type'' application/json' ... Я бы предложил использовать '$ http.post()', поскольку это устанавливает для вас все разумные значения по умолчанию. Тогда вам просто нужно указать URL и данные как объект js. – tigerswithguitars

+0

Я попытался с $ http и $ http.post с тем же результатом. При проверке вызова через Fiddler я вижу, что у обоих из них есть тип содержимого приложения/json –

Смежные вопросы