【问题标题】:How to call MVC Web API Controller after AngularJS popup completesAngularJS弹出完成后如何调用MVC Web API控制器
【发布时间】:2017-09-05 23:31:21
【问题描述】:

我有一个 AngularJS 模块,其中包含调用模式弹出窗口的代码。我也有调用 MVC Web API 控制器方法的代码。这两个功能现在都彼此独立工作。我想要发生的是在用户单击模态框上的确定按钮后,我想获取模态文本框的值并将其作为参数发送到 API 控制器。我到目前为止的代码如下:

app.js:

(function () {
    'use strict';

    var app = angular.module("CRNApp", ['ui.bootstrap','trNgGrid']);

    var MainController = function ($scope, $http, $log, $uibModal) {
        $scope.showGrid = false;
        $scope.showPolicyScreen = false;

        $scope.CRNViewModel = {
            policyId: 0
        };

        $scope.openPolicyId = function () {

            $uibModal.open({
                templateUrl: 'templates/popupGetPolicy.cshtml', 
                backdrop: false, 
                windowClass: 'modal', 
                controller: function ($scope, $uibModalInstance, $log, CRNViewModel) {
                    $scope.CRNViewModel = CRNViewModel;
                    $scope.submit = function () {

                    }
                    $scope.cancel = function () {
                        $uibModalInstance.dismiss('cancel');
                    };
                },
                resolve: { CRNViewModel: function () { return $scope.CRNViewModel; } }
            });//end of modal.open

        }; // end of scope.open fu

        $scope.policyLookup = function (policyNumber) {
            $scope.loading = true;

            $scope.CRNViewModel.policyId = policyNumber; //"WCZ25999"

            $http.post("/api/Policy"
                , $scope.CRNViewModel
                , { header: { 'Content-Type': 'application/json' } }) 
                .then(function (response) {
                    $scope.policy = response.data;
                    $scope.loading = false;
                    $scope.showGrid = false;
                    $scope.showPolicyScreen = true;
                })
                .catch(function (error) {
                    console.log(error);
                    $scope.loading = false;
                    $scope.showGrid = false;
                });
        };
    };

    app.controller("MainController", MainController); 
}());

MVC API 控制器方法:

 // POST: api/Policy
        public IHttpActionResult Post([FromBody]CRNViewModel policy)
        {
            CRNViewModel _crnVM = new CRNViewModel();
            IConditionalRenewalNotices _crn = new ConditionalRenewalNoticesRepository();
            _crnVM = _crn.GetPolicyByPolicyId(policy.PolicyId);
            return Json(_crnVM);
        }

【问题讨论】:

    标签: angularjs asp.net-mvc asp.net-web-api


    【解决方案1】:

    关闭$uibModalInstance 实例时返回文本框值,然后为模态结果添加回调:

    var modal = $uibModal.open({
        templateUrl: 'templates/popupGetPolicy.cshtml',
        backdrop: false,
        windowClass: 'modal',
        controller: function($scope, $uibModalInstance, $log, CRNViewModel) {
            $scope.CRNViewModel = CRNViewModel;
            $scope.submit = function () {
                // pass in the value you want to return
                $uibModalInstance.close('WCZ25999');
            }
            $scope.cancel = function() {
                $uibModalInstance.dismiss('cancel');
            };
        },
        resolve: { CRNViewModel: function() { return $scope.CRNViewModel; } }
    });
    
    modal.result.then(function (value) {
        $scope.policyLookup(value);
    });
    

    【讨论】:

    • 如何从我的 cshtml 页面调用变量模式?我在旧代码中使用它:
    • 没关系,我想通了。 Peco 的回答很完美,谢谢!