下午好。
但是,我创建了一个试图访问C#函数的ajax调用。我收到错误消息“在与请求匹配的控制器'PortalApi'上未找到任何操作。'该请求是一个帖子,服务器函数附加了适当的Http头,函数名称和参数也完全相同。
Ajax
GetExtendersGridDataFromServer(requestParameters) {
extendersGridSource = null;
var gridFilterParams = JSON.stringify(requestParameters);
$.ajax(
{
async: false,
contentType: "application/json",
converters: Utills.jQueryAjaxJsondDataConverter,
data: JSON.stringify({ gridFilterParams: gridFilterParams, securityCode: securityCode }),
dataType: "jsond",
type: "POST",
url: (Utills.getBaseURL() + "/Api/PortalApi/GetExtenderGridData"),
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.responseText);
},
failure: function (msg) {
alert("failure");
},
success: function (msg) {
alert("success");
}
});
}
C#
[HttpPost]
public JqGridData GetExtenderGridData(string securityCode)
{
IMUserSecurity.UserSecurity.ValidateWebMethodSecurityCode(securityCode, "PortalWebService.GetExtenderGridData");
return GetDoctorGridData("extender");
}
路由配置
configuration.Routes.MapHttpRoute("API Action Default", "api/{controller}/{action}/{id}",
new
{
id = RouteParameter.Optional
});
答案 0 :(得分:2)
这里有两个可能的问题:
路由
我建议您使用属性路由,而不要依赖于常规路由( IMO可能会很痛苦)
在WebApiConfig.cs的Register
方法中启用属性路由
config.MapHttpAttributeRoutes();
然后使用RoutePrefix
和Route
属性装饰api控制器和api方法。 RoutePrefix
+ Route
共同构成了通往方法的完整路径
示例api/PortalApi/GetExtenderGridData
[RoutePrefix("api/PortalApi")]
public class PortalApiController : ApiController
{
[Route("GetExtenderGridData")]
[HttpPost]
public IEnumerable<Order> FindOrdersByCustomer(int customerId) { ... }
}
请求正文
您的api方法FindOrdersByCustomer
使用一个字符串作为参数,但是您的客户端正在尝试将对象发送到该方法,目前尚无法实现。
客户对象定义为
{ gridFilterParams: gridFilterParams, securityCode: securityCode }
要能够将其发送到后端api,您需要确保它与该签名匹配。
创建一个可反映客户端模型的类(我不知道gridFilterParams
是什么,但您在这里明白了这一点)
public class RequestModel
{
public object GridFilterParams { get;set; }
public string SecurityCode { get; set; }
}
然后使用api方法从请求正文中读取
[RoutePrefix("api/PortalApi")]
public class PortalApiController : ApiController
{
[Route("GetExtenderGridData")]
[HttpPost]
public IEnumerable<Order> FindOrdersByCustomer([FromBody]RequestModel model) { ... }
}
答案 1 :(得分:1)
尝试添加FromBody属性(more info)。
public JqGridData GetExtenderGridData([FromBody] Security security) { ... }
public class Security
{
public object GridFilterParams { get; set; }
public string SecurityCode { get; set; }
}
答案 2 :(得分:0)
我没有足够的声誉来发表评论,但是您可以尝试
[HttpPost("GetExtenderGridData")
代替
[HttpPost].