如何通过AJAX调用web api多个GET方法

时间:2014-08-20 17:19:24

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

我在webapi中添加了两个GET方法,如下所示:

    public IList<ProductDTO> GetAllProducts()
    {
        ProductManager pm = new ProductManager();

        return pm.RetrieveAllProducts();
        //return pm.RetrieveAllProducts();
    }

    public ProductDTO GetProduct(int i)
    {
        ProductManager pm = new ProductManager();

        return pm.RetrieveAllProducts().Where(c => c.Id == i).FirstOrDefault();
        //return pm.RetrieveAllProducts();
    }

问题,当我只保留一个get方法GetAllProducts()时,它运行正常。但是当我添加GetProduct(int i)然后将错误视为Not found 404错误。

请指导我如何保留mthod并允许访问有参数的方法。

呼叫如下:

           $.ajax({
            type: 'GET',
            url: 'api/values/GetProduct/1',   //giving error as NOT FOUND
            contentType: 'json',
            dataType: 'json',
            success: function (data) {
                $.each(data, function (key, value) {
                    //stringify
                    alert(key);
                    alert(value);
                    var jsonData = JSON.stringify(value);

                    //Parse JSON
                    var objData = $.parseJSON(jsonData);
                    var id = objData.Id;
                    var Cost = objData.Cost;
                    var ProductName = objData.ProductName;
                    var Description = objData.Description;
                    $('<tr><td>' + id + '</td><td>' + ProductName +
                    '</td><td>' + Cost + '</td></tr>').appendTo('#ProductDivWebApi');
                });
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });

我已将此WEBAPI添加到MVC 4项目中。

其路线如下所示:

   public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "ProductManagement", action = "Index", id = UrlParameter.Optional }
        );
      }

请指导

1 个答案:

答案 0 :(得分:1)

ASP.NET WEB API上的路线与ASP.NET MVC不同。您有GET方法,因此,只需使用GET动词调用控制器,框架就会为您解决。我建议您将方法重命名为动词,GetPostPutDelete等。

在您的情况下,请按/api/{controller}/{id}调用方法。在这种情况下,data是一个单独的对象(因为您只返回了ProductDTO),所以不要在其中循环。

您已指定json,因此jquery将在对象中反序列化它。样本:

$.ajax({
    type: 'GET',
    url: 'api/values/1', 
    contentType: 'json',
    dataType: 'json',
    success: function (data) {
        // data is a single object, do not loop in it.
        // you have specified json, so, it will be deserialized     

        var id = data.Id;
        var Cost = data.Cost;
        var ProductName = data.ProductName;
        var Description = data.Description;

        $('<tr><td>' + id + '</td><td>' + ProductName +
        '</td><td>' + Cost + '</td></tr>').appendTo('#ProductDivWebApi');
        });
    },
    error: function (xhr) {
        alert(xhr.responseText);
    }
});

我还建议你在Web API上做一些这样的事情:

[HttpGet]
public HttpResponseMessage GetProduct(int id)
{
   ProductManager pm = new ProductManager();

   var result = pm.RetrieveAllProducts().Where(c => c.Id == id).FirstOrDefault();

   return Request.CreateResponse(HttpStatusCode.OK, result);
}

WebApiConfig.cs文件中,我建议您配置如下路由:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute("DefaultApiGet",
                                "api/{controller}",
                                new {action = "Get"},
                                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+)?"});
}