2016-07-03 5 views
1

私のコントローラアクションがパラメータとして期待するのと同じプロパティでjsオブジェクトを作成しています。私は、このような使用として、StackOverflowの上でいくつかの記事を示唆したものを試してみたコントローラのパラメータは、角度で送信されたときに常にnullです。

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

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コントローラJSON.stringify、コンテンツタイプを変更するが、私はまだパラメータ値を取得するnull(たとえ私がdirecを置くカスタムクラスを使用するのではなく、アクション内にある)。

答えて

1

SelectedLectureDataのデータをシリアル化するために、[FromBody]アノテーションを使用してください。

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

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

とコントローラのアクション

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

JSONのプロパティ名に[FromBody]属性を使用して、あなたのjavascriptをアップデートしてみてくださいを行う必要がありますclasと同じである必要がありますそれ以外の場合はnullと解釈されます。

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

デフォルトのデータバインダーでは、大文字と小文字は区別されません。 –

関連する問題