通过Angular

时间:2016-07-03 13:14:13

标签: angularjs asp.net-mvc asp.net-mvc-5

我创建了一个js对象,其属性与我的控制器操作期望的参数相同。

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(即使我将它们直接放在动作中,而不是使用自定义类。)

3 个答案:

答案 0 :(得分: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
        }})
    })

答案 1 :(得分: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)
{
    // ...
}

答案 2 :(得分:0)

JSON属性名称应与类属性相同,否则将其视为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;
        });