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

时间:2013-01-06 14:31:33

标签: entity-framework jquery asp.net-web-api crud

我尝试在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 个答案:

答案 0 :(得分:1)

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

作为第一步,我建议您下载并安装Fiddler2。打开它,然后使用Composer选项卡为http://localhost:7031/api/product执行GET。这应该显示返回的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;
    }
}

答案 1 :(得分:0)

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

所以..我对我的代码进行了一些更改,结果是预期的


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

查看/ ViewProduct.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'));
                    });
                });

或者......有比这更好的方法,

如果我仍想传递实体对象而不是字符串对象 (列出GetAll()...而不是GetAll string()....)

此致

安德里安

答案 2 :(得分:0)

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

模特:

命名空间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;
    }

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

查看/ ViewProduct.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'));
                });
            });
   }

希望这会对他人有所帮助

此致

安德里安