我希望你能帮助我。我想把我的头发拔出来!
我正在尝试使用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"上找不到与请求匹配的操作。" }
我的堆栈流是这样的:
- adminVendorNumber.html
- adminVendorNumber.controller.js
- VendorController.cs
- 供应商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
}