无法调用web api POST操作

时间:2014-08-20 19:30:19

标签: ajax asp.net-mvc-4 asp.net-web-api

以下是我的web api相关帖子/保存记录:

var c = $.ajax({
    url: 'api/values/CreateAjaxNew',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    data: form.serializeArray(),
    success: function (data) {
        alert(data);
        $("#msg").html("Saved Successfully.");
        $("#msg").css("color", "green");
        //window.location = "index";
        //alert("in success");
    },
    error: function (e1, e2, e3) { alert(e3); }
});

问题:它只是将错误视为Not Found

值controller api:

[HttpPost]
public HttpResponseMessage CreateAjaxNew(ProductViewModel vm)
{
    try
    {
        // TODO: Add insert logic here
        //manager.ProductManager m = new manager.ProductManager();
        using (aRef.ServiceIntf2Client r = new aRef.ServiceIntf2Client())
        {
            r.InsertProduct(new common.DTO.ProductDTO() { Id = vm.Id, ProductName = vm.ProductName, Description = vm.Description, Cost = vm.Cost, ProductTypeId = vm.ProductTypeId });
        }
        //m.InsertProduct(new common.DTO.ProductDTO() { Id = vm.Id, ProductName = vm.ProductName, Description = vm.Description, Cost = vm.Cost, ProductTypeId = vm.ProductTypeId });
        return Request.CreateResponse(HttpStatusCode.OK,true);
    }
    catch 
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError, false);
    }
}

请指导我如何解决此问题,请求达成api操作。

路线如下:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute("DefaultApiGet",
    "api/{controller}",
    new { action = "AllProductTypes" },
    new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
config.Routes.MapHttpRoute("DefaultApiGet1",
    "api/{controller}",
    new { action = "GetAllProducts" },
    new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

config.Routes.MapHttpRoute("DefaultApiGetWithId",
    "api/{controller}/{id}",
    new { id = RouteParameter.Optional, action = "Get" },
    new { id = @"\d+" });

config.Routes.MapHttpRoute("DefaultApiWithAction",
    "api/{controller}/{action}");

config.Routes.MapHttpRoute("DefaultApiWithActionAndId",
    "api/{controller}/{action}/{id}",
    new { id = RouteParameter.Optional },
    new { id = @"\d+(_\d+)?" });

1 个答案:

答案 0 :(得分:0)

路线排序似乎是错误的。您需要先将默认路由移动到最后一个路径和更通用的路由。

http://richarddingwall.name/2008/08/09/three-common-aspnet-mvc-url-routing-issues/

截至目前,api / {controller} / {id}执行默认路由并且找不到控制器。

  config.Routes.MapHttpRoute("DefaultApiGet",
                       "api/{controller}",
                       new { action = "AllProductTypes" },
                       new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
    config.Routes.MapHttpRoute("DefaultApiGet1",
                       "api/{controller}",
                       new { action = "GetAllProducts" },
                       new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

    config.Routes.MapHttpRoute("DefaultApiGetWithId",
                                "api/{controller}/{id}",
                                new { id = RouteParameter.Optional, action = "Get" },
                                new { id = @"\d+" });


    config.Routes.MapHttpRoute("DefaultApiWithAction",
                        "api/{controller}/{action}");

    config.Routes.MapHttpRoute("DefaultApiWithActionAndId",
                        "api/{controller}/{action}/{id}",
                        new { id = RouteParameter.Optional },
                        new { id = @"\d+(_\d+)?" });
   config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

这种排序应该能够解决问题。希望这有帮助