AngularJS API Call with Id as param and C# Contoller



我希望你能帮助我。我想把我的头发拔出来!

我正在尝试使用Id作为传递的参数来进行API调用,以查找特定的记录。

类似这样的东西:$http.get("/api/vendor/ReadVendor/" + vendorId)

需要做什么:

当我选择一个供应商时,对API的调用将使用唯一的供应商id进行。这将传递给控制器、DTO和DB,并返回指定的数据。

我得到一个错误:

404/NotFound{"Message":"未找到与请求URI匹配的HTTP资源"http://localhost:60090/api/vendor/ReadVendor/5"。","MessageDetail":"在控制器"Vendor"上找不到与请求匹配的操作。" }

我的堆栈流是这样的:

  1. adminVendorNumber.html
  2. adminVendorNumber.controller.js
  3. VendorController.cs
  4. 供应商DTO.cs

这是我的adminVendorNumber.html的一部分,用于调用AngularJS函数:

                        <label>Vendor</label>
                        <div class="input-dropdown">
                            <cc-dropdown cc-placeholder="Select Vendor"
                                         ng-model="NewVendorNumber.Vendor"
                                         ng-disabled="false"
                                         ng-options="vendorData"
                                         cc-fields="VendorId"
                                         cc-key-field="VendorId"
                                         cc-allow-search="false"
                                         ng-required="false"
                                         ng-change="vendorSelected()"
                                         name="iVendor">
                            </cc-dropdown>
                        </div>
                    </div>

这是我的AngularJS控制器(其中一部分具有我的特定功能):

(function () {
    "use strict";
    angular
        .module('app.adminVendorNumber')
        .controller('adminVendorNumberController', adminVendorNumberController);
    adminVendorNumberController.$inject = ['$http', 'logger', '$scope'];
    function adminVendorNumberController($http, logger, $scope) {
        var vm = $scope;
        vm.formSubmmision = true;
        vm.vendorItemData = null;
        vm.itemGroupData = null;
        vm.vendorData = null;
        vm.vendorSelected = vendorSelected;
        vm.save = save;
        activate();
        function activate() {
            return vendorItemData().then(getAllItemGroups).then(getVendorData).then(function () {
                logger.info('Activated Vendor Number Creation');
            });
        }

        function vendorSelected() {
            vm.formSubmmision = true;
            return getVendorById(vm.NewVendorNumber.Vendor.VendorId);
        }
        function getVendorById(vendorId) {
            return $http.get("/api/vendor/ReadVendor/" + vendorId)
                .then(Success)
                .catch(Failure);
            function Success(responce) {
                vm.vendorSelected = responce.data.Records;
                return vm.vendorSelected;
            }
            function Failure(error) {
                logger.error('Failed to get Vendor Data ' + error.data.Message);
            }
        }
    };
}
)();

这是我的VendorController.cs函数的一部分,它被称为:

    public class VendorController : ApiController
    {
        private VendorDTO dto = new VendorDTO();
        public HttpResponseMessage ReadVendor(int vendorId)
        {
            try
            {
                CommandResult<Vendor> result = dto.ReadVendor(vendorId);
                return Request.CreateResponse((result.Status == CommandStatus.Success ? HttpStatusCode.OK : HttpStatusCode.InternalServerError), result);
            }
            catch (IOWAException ex)
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
        }
    }
}

下面是调用VedorDTO.cs的下一步:

public class VendorDTO
{
    public CommandResult<Vendor> ReadVendor(int vendorId)
    {
        return readVendor(vendorId);
    }
    private CommandResult<Vendor> readVendor(int vendorId)
    {
        CommandResult<Vendor> result = null;
        try
        {
            VendorContext dalVendor = new VendorContext();
            result = dalVendor.Read(vendorId);
        }
        catch (IOWAException ex)
        {
            result = new CommandResult<Vendor>(ex, "Error reading Vendors");
        }
        return result;
    }

指定操作的[HttpGet]属性,如下所述:

[HttpGet]
public HttpResponseMessage ReadVendor(int vendorId)

请使用GetReadVendor更改方法名称

将HttpGet添加到您的方法之上,如下所示:

[HttpGet]
public HttpResponseMessage ReadVendor(int vendorId)
[HttpGet]
 public CommandResult<Vendor> ReadVendor(int vendorId)
{
    return readVendor(vendorId);
}

还有一件事试试这个来获取

         $http.get('Your URL/?vendorId='+your val)

您的API控制器似乎有一些问题。您必须在控制器中定义HTTP方法和路由才能使其工作。此外,您需要将vendorId更改为id。

[RoutePrefix("api/vendor")]
public class VendorController : ApiController
{
    [Route("ReadVendor"), HttpGet]
    public HttpResponseMessage ReadVendor(int? id)
    {
        return Request.CreateResponse(HttpStatusCode.OK, "");
    }
    //Rest of your code
}

最新更新