WebApi在控制器上找不到动作

时间:2018-09-11 17:49:45

标签: c# ajax asp.net-web-api

下午好。
但是,我创建了一个试图访问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
        });

3 个答案:

答案 0 :(得分:2)

这里有两个可能的问题:

路由

我建议您使用属性路由,而不要依赖于常规路由( IMO可能会很痛苦

在WebApiConfig.cs的Register方法中启用属性路由

config.MapHttpAttributeRoutes();

然后使用RoutePrefixRoute属性装饰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].