首页 文章

VS Web Web应用程序中的ASP.NET Web Api CRUD操作

提问于
浏览
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 }
      );

Controller / ProductController.cs:

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

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

查看/ ViewProduct.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>

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

enter image description here

Bellow是getProducts()函数的结果:

enter image description here

请帮我 .

有什么想法或建议吗?

3 回答

  • 1

    当您执行 $.getJSON("/api/product", ... 时,您没有收到您发布的XML . 你回来了JSON .

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

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

    Update

    是的,还有更好的方法 . 首先,创建一个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;
        }
    }
    
  • 0

    做了一些研究后,我最终找到了(请纠正我,如果我错了):JavaScriptSerializer无法从实体和其他实体(产品和类别)之间的关系序列化整个对象树 .

    所以..我对我的代码做了一些更改,结果如预期的那样


    Controller/ProductController.cs :

    From :

    public class ProductController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
    
        public List<Product> GetAll()
        {
            return db.Products.ToList<Product>();// ;
        }
    

    To :

    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);
        }
    

    View/ViewProduct.aspx :

    From :

    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'));
    
                        });
                    });
    

    To :

    $.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()....)

    问候,

    安德里安

  • 0

    所以..这是我的最终工作准则

    Models :

    命名空间MyLabs1.Models

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

    Controller/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;
        }
    

    OR

    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;
    }
    

    View/ViewProduct.aspx :

    function getProducts(){
    $ .getJSON( “/ API /产品”,
    function(data){
    $ .each(data,function(key,val){
    var row ='<tr> <td>'val.ProductName'</ td> <td>'val.ProductID'</ td> <tr />';
    $(行).appendTo($( '#tblproduct'));
    });
    });
    }

    Hope This Will Be Helpful to Others

    问候,

    安德里安

相关问题