调用具有 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 控制器操作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net Web Api 的 url 参数中发送控制器操作?