首页 > 解决方案 > 调用具有 2 个参数的 WebAPI 控制器操作

问题描述

我有一个具有 2 个参数的 WebAPI 控制器操作。我怎么称呼这个动作?

使用单个参数,我的代码运行良好。如何调用具有 2 个参数的 WebAPI?我尝试了几种方法,但它不起作用。我有一个具有 2 个参数的 WebAPI 控制器操作。我怎么称呼这个动作?

使用单个参数,我的代码运行良好。如何调用具有 2 个参数的 WebAPI?我尝试了几种方法,但它不起作用。

提前致谢

//With a single parameter it works good:
[Route("api/Controller/GetAllVendors")]
[HttpPost]
public IEnumerable<Vendor> GetAllVendors(LoginParameters loginParam)
{
}

function LoadVendorLkup() {
    alert("InVendorCall");
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
$.ajax({
    type: 'POST',
    url: '/api/Controller/GetAllVendors',
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 

/////////////////////////////////////////////////////////////////////////
//With 2 parameters , it does not work:

[Route("api/Controller/GetVendorsForSelectedHouseholdID")]
[HttpPost]
public IEnumerable<Vendor> GetVendorsForSelectedHouseholdID(LoginParameters loginParam, string hHoldID)
{
}

function LoadVendorLkupForSelectedHousehold() {
    var hHoldtext = $('#txtHHold').val();
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
 $.ajax({
    type: 'POST',
    url: '/api/controller/GetVendorsForSelectedHouseholdID',
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 'hHoldID': hHoldtext,
//////////////////////////////////////////////////////

//I also tried the following:
[Route("api/controller/GetVendorsForSelectedHouseholdID/{hHoldID:String}")]
[HttpPost]
public IEnumerable<Vendor> GetVendorsForSelectedHouseholdID([FromBody()]LoginParameters loginParam,[FromUri()]string hHoldID)
{
}

function LoadVendorLkupForSelectedHousehold() {
    alert("InVendorCall2");
    var hHoldtext = $('#txtHHold').val();
    alert("Household:" + hHoldtext);
    var loginPar = {
    UserName: 'user1',
    CompanyID: 'company1',
    ProgramID: ''
}
$.ajax({
    type: 'POST',
    url: '/api/controller/GetVendorsForSelectedHouseholdID?hHoldID='+ hHoldtext,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(loginPar), 

标签: c#jqueryasp.netasp.net-web-apiasp.net-web-api2

解决方案


POST 参数上的多个 [FromBody] 属性将无法正常工作,如此处文档中所述

// Caution: Will not work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }

此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。

此博客指定有 3 种简单的方法可以实现此目的:

  1. 同时使用 POST 和 GET(一个参数来自查询字符串的另一个参数)

  2. 创建 1 个模型,将所有值封装在单个模型中

  3. 使用 JSON.Stringify 将单个 JSON 传递给 API,然后使用 JObject 作为 web api 中的参数。然后在 web api 中解析 JSON。

还有一个选项 - 您还可以使用文档中提到的 IModelBinder 创建自定义活页夹:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/参数绑定在-aspnet-web-api


推荐阅读