Я пытаюсь создать быстрое приложение, чтобы попытаться изучить 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; }
}
Спасибо за ваши комментарии, я попробовал его с помощью параметра метода веб-API в качестве объекта пользователя напрямую , но все же закончил с пустым объектом, поэтому изменил его на JObject, чтобы убедиться, что я получаю данные, как ожидалось. Я изменил свой исходный вопрос с помощью объекта области AngularJS, который я передаю –
Если вы используете HTTP-службу напрямую, вам нужно будет установить заголовок 'content-type'' application/json' ... Я бы предложил использовать '$ http.post()', поскольку это устанавливает для вас все разумные значения по умолчанию. Тогда вам просто нужно указать URL и данные как объект js. – tigerswithguitars
Я попытался с $ http и $ http.post с тем же результатом. При проверке вызова через Fiddler я вижу, что у обоих из них есть тип содержимого приложения/json –