如何通过ID正确检索记录

时间:2014-02-17 15:40:49

标签: angularjs asp.net-web-api

在我的Angular / WebAPI应用程序中,我正在努力通过其ID检索特定记录。 在前端我有一个控制器和一个数据服务。控制器调用数据服务上的方法,数据服务对WebAPI进行$ http调用。 在我的控制器中,我将所需记录的OID传递给数据服务的getServiceRequestById方法。一旦我的问题是,那个OID的实际值是:1而不是1。 我的另一个问题是,当数据服务调用WebAPI时,WebAPI会感知请求,就好像它在其中没有ID,并将该请求传递给其Get()方法,而不是Get(int Id)。 这是我的前端控制器:

angular.module('frontEndApp').controller('EditServiceRequestCtrl',['$scope', 'requestsRepository','$routeParams',
    function ($scope, requestsRepository,$routeParams) {
        console.log("This is EditServiceRequestCtrl ; $routeParams:  " + $routeParams);
        //First we make a call to the data service, to fetch our ServiceRequest by its OID
        //Then, in the callback function, we populate the $scope models below with the data of our retreived ServiceRequest
        var getCleanId = function () {
            return $routeParams.OID.substring(0, 2)
        };
        var Id = getCleanId();
        //var cleanId = id.substring(0, 2);
        console.log('getCleanId  Id:   ' + Id);
        requestsRepository.getServiceRequestById(Id, function (request) {

            $scope.OID = request.OID;
            $scope.RequestorName = request.RequestorName;
            $scope.RequestorBusinessUnit = request.RequestorBusinessUnit;
            $scope.CustomerName = request.CustomerName;
            $scope.CscContactPerson = request.CscContactPerson;
            $scope.IsWbsCodeAvailable = request.IsWbsCodeAvailable;
            $scope.SalesforceIdNumber = request.SalesforceIdNumber;
            $scope.ProjectCtv = request.ProjectCtv;
            $scope.RequestedCompletionDate = request.RequestedCompletionDate;
            $scope.ToBeUsedForCloudMigration = request.ToBeUsedForCloudMigration;
            $scope.ToBeUsedForDatacenterMove = request.ToBeUsedForDatacenterMove;
            $scope.ToBeUsedForServerRefresh = request.toBeUsedForServerRefresh;
            $scope.DataRequirements = request.DataRequirements;
            $scope.DataProtectionRequirements = request.DataProtectionRequirements;
            $scope.ProjectedDataAvailability = request.ProjectedDataAvailability;
            $scope.DiscoveryLeadName = request.DiscoveryLeadName;
            $scope.SelectedCountries = request.SelectedCountries;
            $scope.ManualDiscovery = request.ManualDiscovery;
            $scope.AutomatedDiscovery = request.AutomatedDiscovery;
            $scope.DataLoadUsingMasterTemplate = request.DataLoadUsingMasterTemplate;
            $scope.DataLoadUsingAutomatedInterface = request.DataLoadUsingAutomatedInterface;
            $scope.DataLoaderRequiresSitizenship = request.DataLoaderRequiresSitizenship;

            $scope.countries = [
                {
                    name: "US", checked: false
                },
                {
                    name: "UK", checked: false
                },
                {
                    name: "France", checked: false
                },
                {
                    name: "Germany", checked: false
                },
                {
                    name: "Sweden", checked: false
                },
                {
                    name: "Danmark", checked: false
                }
            ];
            var list = [];

            $scope.checkit = function () {

                for (var p in $scope.countries) {
                    if ($scope.countries[p].checked) {
                        list.push($scope.countries[p].name);

                        console.log("selected country:  " + $scope.countries[p].name + "  " + $scope.ProjectedDataAvailability);
                    }
                } return list;
            }
            console.log('EditServiceRequestCtrl  $scope.RequestorName :   ' + $scope.RequestorName);
        });
    $scope.updateServiceRequest = function () {
        var ServiceRequest = {
            requestorName: $scope.RequestorName,
            requestorBusinessUnit: $scope.RequestorBusinessUnit,
            customerName: $scope.CustomerName,
            cscContactPerson: $scope.CscContactPerson,
            isWbsCodeAvailable: $scope.IsWbsCodeAvailable,
            salesforceIdNumber: $scope.SalesforceIdNumber,
            projectCtv: $scope.ProjectCtv,
            requestedCompletionDate: $scope.RequestedCompletionDate,
            projectedDataAvailability: $scope.ProjectedDataAvailability,
            toBeUsedForCloudMigration: $scope.ToBeUsedForCloudMigration,
            toBeUsedForDatacenterMove: $scope.ToBeUsedForDatacenterMove,
            toBeUsedForServerRefresh: $scope.ToBeUsedForServerRefresh,
            dataRequirements: $scope.DataRequirements,
            dataProtectionRequirements: $scope.DataProtectionRequirements,
            selectedCountries:
                list.filter(function (itm, i, a) {
                    return i == a.indexOf(itm);
                }).toString(),
            projectedDataAvailability: $scope.ProjectedDataAvailability,
            discoveryLeadName: $scope.DiscoveryLeadName,
            manualDiscovery: $scope.ManualDiscovery,
            automatedDiscovery: $scope.AutomatedDiscovery,
            dataLoadUsingMasterTemplate: $scope.DataLoadUsingMasterTemplate,
            dataLoadUsingAutomatedInterface: $scope.DataLoadUsingAutomatedInterface,
            dataLoaderRequiresSitizenship: $scope.DataLoaderRequiresSitizenship

        };

        requestsRepository.updateServiceRequest(ServiceRequest);
    }
}]);

这是我的前端数据服务:

frontEndApp.factory('requestsRepository',function ($http) {

    var createServiceRequest = function (ServiceRequest) {
        $http(
        {
            url: 'http://localhost:8080/api/ServiceRequests', method: "POST", data: ServiceRequest,
            headers: {
                'Content-Type': 'application/json'
            }
        }).success(function (data, status, headers, config) {
            console.log("createServiceRequest Status: " + status);
        }).error(function (data, status, headers, config) {
            console.log("createServiceRequest FAILURE: " + status + "  ServiceRequest:  " + ServiceRequest);
        });
    };

    var updateServiceRequest = function (ServiceRequest) {
        $http(
        {
            url: 'http://localhost:8080/api/ServiceRequests', method: "PUT", data: ServiceRequest,
            headers: {
                'Content-Type': 'application/json'
            }
        }).success(function (data, status, headers, config) {
            console.log("updateServiceRequest Status: " + status);
        }).error(function (data, status, headers, config) {
            console.log("updatetServiceRequest FAILURE: " + status + "  ServiceRequest:  " + ServiceRequest);
        });
    };

    var getServiceRequests = function (successCallback) {
        $http({
            method: 'GET', url: 'http://localhost:8080/api/ServiceRequests'
        }).success(function (data, status, headers, config) {
            successCallback(data);
        }).error(function (data, status, headers, config) {
            return status;
        });
    };

    var getServiceRequestById = function (Id,successCallback) {
        $http({
            method: 'GET', url: 'http://localhost:8080/api/ServiceRequests/' + Id

        }).success(function (data, status, headers, config) {
            console.log("getServiceRequestById,  data:   " + data);
            successCallback(data);
        }).error(function (data, status, headers, config) {
            return status;
        });
    };



    return {
        createServiceRequest: createServiceRequest, getServiceRequests: getServiceRequests,
        updateServiceRequest: updateServiceRequest, getServiceRequestById: getServiceRequestById
    };
});

这是我的后端WebAPI:

public HttpResponseMessage Get()
        {

            var requestList = from req in new XPQuery<DummyRequest>(uow) select req;

            List<AccountViewServiceRequest> dataList = new List<AccountViewServiceRequest>();

            foreach(var item in requestList)
            {
                AccountViewServiceRequest sr = new AccountViewServiceRequest();
                sr.OID = item.Oid;
                sr.RequestorName = item.RequestorName;
                sr.RequestorBusinessUnit = item.RequestorBusinessUnit;
                sr.CustomerName = item.CustomerName;
                sr.CscContactPerson = item.CscContactPerson;
                sr.IsWbsCodeAvailable = item.IsWbsCodeAvailable;
                sr.SalesforceIdNumber = item.SalesforceIdNumber;
                sr.ProjectCtv = item.ProjectCtv;
                sr.RequestedCompletionDate = item.RequestedCompletionDate;
                sr.ToBeUsedForCloudMigration = item.ToBeUsedForCloudMigration;
                sr.ToBeUsedForDatacenterMove = item.ToBeUsedForDatacenterMove;
                sr.ToBeUsedForServerRefresh = item.ToBeUsedForServerRefresh;
                sr.DataRequirements = item.DataRequirements;
                sr.SelectedCountries = item.SelectedCountries;
                sr.DataProtectionRequirements = item.DataProtectionRequirements;
                sr.ProjectedDataAvailability = item.ProjectedDataAvailability;
                sr.DiscoveryLeadName = item.DiscoveryLeadName;
                sr.ManualDiscovery = item.ManualDiscovery;
                sr.AutomatedDiscovery = item.AutomatedDiscovery;
                sr.DataLoadUsingMasterTemplate = item.DataLoadUsingMasterTemplate;
                sr.DataLoadUsingAutomatedInterface = item.DataLoadUsingAutomatedInterface;
                sr.DataLoaderRequiresSitizenship = item.DataLoaderRequiresSitizenship;


                dataList.Add(sr);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK, dataList.ToList()); 
            response.Headers.Add("Access-Control-Allow-Origin", "*");
            return response;
        }

        public HttpResponseMessage Get(int Oid)
        {

            var item = (from req in new XPQuery<DummyRequest>(uow) where req.Oid == Convert.ToInt32(Oid) select req).First();

                AccountViewServiceRequest sr = new AccountViewServiceRequest();
                sr.OID = item.Oid;
                sr.RequestorName = item.RequestorName;
                sr.RequestorBusinessUnit = item.RequestorBusinessUnit;
                sr.CustomerName = item.CustomerName;
                sr.CscContactPerson = item.CscContactPerson;
                sr.IsWbsCodeAvailable = item.IsWbsCodeAvailable;
                sr.SalesforceIdNumber = item.SalesforceIdNumber;
                sr.ProjectCtv = item.ProjectCtv;
                sr.RequestedCompletionDate = item.RequestedCompletionDate;
                sr.ToBeUsedForCloudMigration = item.ToBeUsedForCloudMigration;
                sr.ToBeUsedForDatacenterMove = item.ToBeUsedForDatacenterMove;
                sr.ToBeUsedForServerRefresh = item.ToBeUsedForServerRefresh;
                sr.DataRequirements = item.DataRequirements;
                sr.SelectedCountries = item.SelectedCountries;
                sr.DataProtectionRequirements = item.DataProtectionRequirements;
                sr.ProjectedDataAvailability = item.ProjectedDataAvailability;
                sr.DiscoveryLeadName = item.DiscoveryLeadName;
                sr.ManualDiscovery = item.ManualDiscovery;
                sr.AutomatedDiscovery = item.AutomatedDiscovery;
                sr.DataLoadUsingMasterTemplate = item.DataLoadUsingMasterTemplate;
                sr.DataLoadUsingAutomatedInterface = item.DataLoadUsingAutomatedInterface;
                sr.DataLoaderRequiresSitizenship = item.DataLoaderRequiresSitizenship;


            var response = Request.CreateResponse(HttpStatusCode.OK, sr);
            response.Headers.Add("Access-Control-Allow-Origin", "*");
            return response;
        }

根据其OID成功检索单个e记录,我应该更正哪个部分?

1 个答案:

答案 0 :(得分:1)

由于您的第一个问题似乎与此例程有关:

    var getCleanId = function () {
        return $routeParams.OID.substring(0, 2)
    };

将子串起始位置更改为1以删除前置冒号。

    var getCleanId = function () {
        return $routeParams.OID.substring(1, 2)
    };

反过来应该解决这个问题,而不是从网络API中获取单个记录。 web api试图在Web服务器上的控制器中找到匹配的函数签名。唯一的参数无法转换为整数,因此它使用Get()而不是Get(int Oid)。