2014-02-18 3 views
0

Я изучаю angularjs и web.api v2 на данный момент.web.api не может надлежащим образом связать объект JSON

Я пытаюсь отправить простой объект javascript в контроллер web.api 2.
Контроллер не делать: принимает объект и возвращает его (web.api):

[RoutePrefix("api/v1")] 
public class UsersController : ApiController 
{ 
    [HttpPost] 
    [Route("users")] 
    public IHttpActionResult Save([FromBody] User user) 
    { 
     return Ok(user); 
    } 
} 

Это пользователя класс (web.api):

public class User 
{ 
    public int Code { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string Telephone { get; set; } 
    public string Email { get; set; } 
} 

В мое клиентское приложение, я реплицировал объектную модель. Мой контроллер возвращает что-то вроде этого (angularjs):

vm.user = { 
    firstName: '', 
    lastName: '', 
    address: '', 
    city: '', 
    telephone: '', 
    email: '' 
}; 

и это мое мнение:

<div class="list card" ng-controller="userregistration as vm"> 
    <div class="list"> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Nome:</span> 
     <input type="text" placeholder="" ng-model="vm.user.firstName"> 
    </label> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Cognome</span> 
     <input type="text" placeholder="" ng-model="vm.user.lastName"> 
    </label> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Indirizzo</span> 
     <input type="text" placeholder="" ng-model="vm.user.address"> 
    </label> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Città</span> 
     <input type="text" placeholder="" ng-model="vm.user.city"> 
    </label> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Telefono:</span> 
     <input type="text" placeholder="" ng-model="vm.user.telephone"> 
    </label> 
    <label class="item item-input item-stacked-label"> 
     <span class="input-label">Email</span> 
     <input type="text" placeholder="" ng-model="vm.user.email"> 
    </label> 
    </div> 
    <div class="padding"> 
    <button class="button button-block button-positive" ng-click="vm.registerUser(vm.user);">Crea Utente</button> 
    </div> 
</div> 

и это registerUser метод в мой контроллер (angularjs):

vm.registerUser = function (user) 
{ 
    dataService.registerUser(user) 
    .then(
     function (result) { 
     device.showAlert(result.Code, config.name, 'CONGRATULAZIONI'); 
     }, 
     function (reason) { 
     device.showAlert(reason, config.name, 'ATTENZIONE'); 
     } 
    ); 
} 

Мой сервисный модуль (angularjs) получает объект пользователя и отправляет его моему контроллеру web.api:

function saveUser(token, user) 
{ 
var deferred = $q.defer(); 

$http({ 
    method: 'POST', url: config.webAPIsBaseUrl + '/api/v1/users', 
    // headers: { 'Authorization': 'Bearer ' + token }, 
    data: { user: user } 
}) 
.success(function (data, status, headers, config) { 
    console.log('saveUser() => success.'); 
    deferred.resolve(data); 
    } 
) 
.error(function (data, status, headers, config) { 
    if (data.Message) { 
     console.log('saveUser() => error 1.'); 
     deferred.reject(data.Message); 
     } 
    else { 
     console.log('saveUser() => error 2.'); 
     deferred.reject("An error occured while registering user!", status); 
     } 
    } 
); 
return (deferred.promise); 
} 

Когда я отправляю свой объект user в свой API, мой контроллер не может правильно сериализовать пользователя.

Все поля пустые.

Я исследовал немного с стелькой, и я видел, что объект заворачивает таким образом:

{"user":{"firstName":"LeftyX","lastName":"","address":"","city":"","telephone":"","email":""}} 

Я попытался удалить user обертки:

{"firstName":"LeftyX","lastName":"","address":"","city":"","telephone":"","email":""} 

и теперь все работает так, как ожидалось.

Вопросы:

Есть ли способ, чтобы связать объекты JavaScript для модели моего контроллера?

ответ

2

Вместо передачи data: { user: user } в $http(), просто передать user как это ...

$http({ 
    method: 'POST', url: config.webAPIsBaseUrl + '/api/v1/users', 
    // headers: { 'Authorization': 'Bearer ' + token }, 
    data: user 
}) 
+0

Благодаря Энтони. Оно работает. Приветствия. – LeftyX