【问题标题】:Calling a WebAPI controller action that has 2 parameters调用具有 2 个参数的 WebAPI 控制器操作
【发布时间】: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% 确定。

标签: c# jquery asp.net asp.net-web-api asp.net-web-api2


【解决方案1】:

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

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

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

This blog 指定有 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/parameter-binding-in-aspnet-web-api

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多