调用具有 2 个参数的 WebAPI 控制器操作

Posted

技术标签:

【中文标题】调用具有 2 个参数的 WebAPI 控制器操作【英文标题】:Calling a WebAPI controller action that has 2 parameters 【发布时间】:2019-06-08 18:00:18 【问题描述】:

我有一个包含 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), 

【问题讨论】:

一般来说,你发送给控制器的是一个“视图模型”。如果它与后端中的特定类不完全匹配,那没关系,因为您可以根据需要解析它。那么,为什么不将hHoldID 添加到LoginParameters 或创建一个表示视图模型的新类? 将 hHoldID 添加到 LoginParameters 是我的最后一个选择。我仍然想知道当有 2 个参数时如何调用。我尝试过的那些不起作用。我打电话的方式有什么问题吗? 如果其中一个是复杂类型,我不确定您是否可以使用多个参数。我认为您只能使用原语和字符串,但我不是 100% 确定。 【参考方案1】:

POST 参数上的多个 [FromBody] 属性不会像 in the documentation here 中提到的那样工作。

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

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

This blog 指定有 3 种简单的方法可以实现这一点:

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

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

    使用 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/parameter-binding-in-aspnet-web-api

【讨论】:

以上是关于调用具有 2 个参数的 WebAPI 控制器操作的主要内容,如果未能解决你的问题,请参考以下文章

WebApi 未在控制器上找到操作

如何在 Asp.net Web Api 的 url 参数中发送控制器操作?

Web API 和 AngularJs

使用 mvc 视图中的参数从 jquery 调用 web api

如何在WebAPI的控制器的GET请求中传递参数

为啥没有调用第二个单点触控视图控制器工具栏按钮事件处理程序