2016-07-03 4 views
1

Я создаю объект js с теми же свойствами, что и мои действия контроллера, как параметры.Параметры на контроллере всегда равны нулю при отправке через Angular

controller.js

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .controller('requestController', requestController); 

    requestController.$inject = ['$scope', 'lecturesFactory', 'attendeesFactory']; 

     $scope.setSelectedLectures = function() { 

      var lecture1, lecture2; 

      for (var i = $scope.lectures.length - 1; i >= 0; i--) { 
       var lecture = $scope.lectures[i]; 

       if (lecture.selected === true) { 
        if (lecture1 == null) { 
         lecture1 = lecture.lectureId; 
        } 
        else { 
         lecture2 = lecture.lectureId; 
        } 
       } 
      } 

      attendeesFactory.setSelectedLectures($scope.emailAddress.text, lecture1, lecture2).then(function (data) { 
       $scope.showInvalidUserMessage = true; 
       $scope.message = data.message; 
      }); 
     }; 

     activate(); 

     function activate() { } 
    } 
})(); 

attendessFactory.js

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('attendeesFactory', attendeesFactory); 

    attendeesFactory.$inject = ['$http']; 

    function attendeesFactory($http) { 
     var service = { 
      setSelectedLectures: setSelectedLectures 
     }; 

     return service; 

     function setSelectedLectures(emailAddress, lecture1, lecture2) { 
      var promise = $http({ 
       method: 'POST', 
       url: '/Home/SetSelectedLectures', 
       data: { 
        emailAddress: emailAddress, 
        lecture1: lecture1, 
        lecture2: lecture2 
       } 
      }).then(function (response) { 
       console.log(response); 
       return response.data; 
      }); 

      return promise; 
     } 
    } 
})(); 

И мой MVC контроллер:

public class HomeController : Controller 
{ 
    public IActionResult Index() 
    { 
     return View(); 
    } 
    [HttpPost] 
    public IActionResult SetSelectedLectures(SelectedLectureData data) 
    { 
     // ... 
    } 
} 

public class SelectedLectureData 
{ 
    public String EmailAddress { get; set; } 
    public int Lecture1 { get; set; } 
    public int? Lecture2 { get; set; } 
} 

Я попробовал то, что некоторые посты на StackOverflow предложил, например, с помощью JSON.stringify, изменяя тип содержимого, но я все равно получаю значения параметров null (даже если я помещаю их в директорию в действии, вместо использования пользовательского класса).

ответ

1

Используйте [FromBody] anotation, чтобы заставить его работать, чтобы сериализовать данные в модели SelectedLectureData.

public IActionResult SetSelectedLectures([FromBody]SelectedLectureData data) 

В противном случае вам нужно сделать

var promise = $http({ 
     method: 'POST', 
     url: '/Home/SetSelectedLectures', 
     data: JSON.strigify({ "data": { 
      emailAddress: emailAddress, 
      lecture1: lecture1, 
      lecture2: lecture2 
     }}) 
    }) 
+0

Вы были правы. Все, что мне было нужно, это аннотация '[FromBody]. –

0

Попробуйте обновить свой JavaScript, чтобы

function setSelectedLectures(emailAddress, lecture1, lecture2) { 
    var model = { 
      emailAddress: emailAddress, 
      lecture1: lecture1, 
      lecture2: lecture2 
     }; 
    var data = JSON.strigify(model); 
    var promise = $http({ 
     method: 'POST', 
     url: '/Home/SetSelectedLectures', 
     data: data 
    }).then(function (response) { 
     console.log(response); 
     return response.data; 
    }); 

    return promise; 
} 

и используя [FromBody] атрибут действия контроллера

[HttpPost] 
public IActionResult SetSelectedLectures([FromBody]SelectedLectureData data) 
{ 
    // ... 
} 
0

JSON Имя свойства должен быть таким же, как клас в других случаях это будет считаться нулевым

function setSelectedLectures(emailAddress, lecture1, lecture2) { 
     var promise = $http({ 
      method: 'POST', 
      url: '/Home/SetSelectedLectures', 
      data: { 
       EmailAddress : emailAddress, 
       Lecture1: lecture1, 
       Lecture2: lecture2 
      } 
     }).then(function (response) { 
      console.log(response); 
      return response.data; 
     }); 
+0

Значение по умолчанию для данных не чувствительно к регистру. –