0

我试图在 VS 2010 Web 应用程序中进行 ASP.NET Web Api CRUD 操作,但为什么结果没有从源表中返回所有整行。

这是我的代码:

路线/Globax.asax

protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.MapHttpRoute(
            name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", // browse with localhost:7031/api/product
                //routeTemplate: "{controller}/{id}",  // browse with localhost:7031/product
                 defaults: new { id = System.Web.Http.RouteParameter.Optional }
      );

控制器/ProductController.cs:

    public class ProductController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();

        public List<Product> GetAll()
        {
            return db.Products.ToList<Product>();// ;
        }

查看/查看Product.aspx:

    <script src="Script/jquery-1.7.1.min.js" type="text/javascript"></script>

<script type="text/javascript">
    $(function () {
        $('#<%= cviewproduct.ClientID %>').click(function (e) {
            getProducts();
            e.preventDefault();
        });

    });

    function getProducts() {
        $.getJSON("/api/product",
                function (data) {
                    $.each(data, function (key, val) {
                        //var str = val.ProductName;
                        // alert(str);

                        var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>';

                        $(row).appendTo($('#tblproduct'));


                    });
                });
    }
</script>

波纹管是产品控制器通过' http://localhost:7031/api/product '的结果:

在此处输入图像描述

波纹管是 getProducts() 函数的结果:

在此处输入图像描述

请帮我。

有什么想法或建议吗?

4

3 回答 3

1

当您执行时$.getJSON("/api/product", ...,您不会像发布的那样返回 XML。您将返回 JSON。

作为第一步,我建议您下载并安装Fiddler2。打开它,然后使用 Composer 选项卡对http://localhost:7031/api/product. 这应该会向您显示返回的 JSON,这将与 XML 不同。将该 JSON 发布到您的原始问题中,我们应该能够提供进一步的帮助。

我的猜测是 JSON 格式不正确。您的 WebApiConfig.cs 类是什么样的?

更新

是的,有更好的方法。首先,创建一个 ApiModel(ApiModel 之于 WebAPI,ViewModel 之于 MVC):

public class ProductApiModel
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
}

现在,从控制器返回这个而不是实体:

public class ProductController : ApiController
{
    public IEnumerable<ProductApiModel> GetAll()
    {
        var products = db.Products
            .OrderBy(x => x.ProductID)
            .Select(x => new ProductApiModel
            {
                ProductId = x.ProductID,
                ProductName = x.ProductName
            });
        return products;
    }
}

如果你使用AutoMapper,你可以让你的控制器代码更短一点:

public class ProductController : ApiController
{
    public IEnumerable<ProductApiModel> GetAll()
    {
        var entities = db.Products.OrderBy(x => x.ProductID);
        var models = Mapper.Map<ProductApiModel[]>(entities);
        return models;
    }
}
于 2013-01-08T16:07:45.253 回答
0

经过一番研究,我终于发现(请纠正我,如果我错了):JavaScriptSerializer 无法从实体与其他实体(产品和类别)之间的关系序列化整个对象树。

所以..我对我的代码做了一些修改,结果和预期的一样


控制器/ProductController.cs:

从 :

public class ProductController : ApiController
{
    NorthwindEntities db = new NorthwindEntities();

    public List<Product> GetAll()
    {
        return db.Products.ToList<Product>();// ;
    }

到 :

public class ProductController : ApiController
{

   public string GetAll()
    {
        var product = db.Products.OrderBy(x => x.ProductID).Select(x => new
                     {
                         ProductId = x.ProductID,
                         ProductName = x.ProductName
                     });
        return JsonConvert.SerializeObject(product);
    }

查看/查看Product.aspx:

从 :

function getProducts() {
        $.getJSON("/api/product",
                function (data) {
                    $.each(data, function (key, val) {
                        var row = '<tr> <td>' + val.ProductName 
            + '</td><td>' + val.ProductID + '</td><tr/>';
                        $(row).appendTo($('#tblproduct'));

                    });
                });

到 :

$.getJSON("/api/product",
                function (data) {
                    var obj = $.parseJSON(data);
                    $.each(obj, function (key, val) {
                        var row = '<tr> <td>' + val.ProductId 
        + '</td><td>' + val.ProductName + '</td><tr/>';
                        $(row).appendTo($('#tblproduct'));
                    });
                });

或者……有没有比这更好的方法,

如果我仍然想传递一个实体对象而不是一个字符串对象(List GetAll ()... 而不是 GetAll string ()....)

问候,

安德里安

于 2013-01-15T04:06:30.800 回答
0

所以..这是我的最终工作代码

楷模 :

命名空间 MyLabs1.Models

{
    public class ProductApi
    {
        [Key]
        public Int32 ProductID { get; set; }
        public string ProductName { get; set; }
    }
}

控制器/ProductController.cs:

public IEnumerable<ProductApi> getall()
    {
        Mapper.CreateMap<Product, ProductApi>();
        var entities = db.Products.OrderBy(x => x.ProductID).ToList();
        var models = Mapper.Map<ProductApi[]>(entities);
        return models;
    }

或者

public List<ProductApi> GetAll()
{
    var products = db.Products
        .OrderBy(x => x.ProductID)
        .Select(x => new ProductApi
        {
            ProductID = x.ProductID,
            ProductName = x.ProductName
        }).ToList();
    return products;
}

查看/查看Product.aspx:

function getProducts() {
    $.getJSON("/api/product",
            function (data) {
                $.each(data, function (key, val) {
                    var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>';
                    $(row).appendTo($('#tblproduct'));
                });
            });
   }

希望这对其他人有帮助

问候,

安德里安

于 2013-01-30T07:42:42.237 回答