VS Web Web应用程序中的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 GetAll() { return db.Products.ToList();// ; } 

查看/ ViewProduct.aspx:

    $(function () { $('#').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 = ' ' + val.ProductName + '' + val.ProductID + ''; $(row).appendTo($('#tblproduct')); }); }); }  

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

在此处输入图像描述

Bellow是getProducts()函数的结果:

在此处输入图像描述

请帮我。

有什么想法或建议吗?

当你执行$.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 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 GetAll() { var entities = db.Products.OrderBy(x => x.ProductID); var models = Mapper.Map(entities); return models; } } 

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

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


Controller / ProductController.cs:

来自:

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

至 :

 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 = ' ' + val.ProductName + '' + val.ProductID + ''; $(row).appendTo($('#tblproduct')); }); }); 

至 :

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

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

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

问候,

安德里安

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

楷模 :

命名空间MyLabs1.Models

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

Controller / ProductController.cs:

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

要么

 public List 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 = ' ' + val.ProductName + '' + val.ProductID + ''; $(row).appendTo($('#tblproduct')); }); }); } 

希望这会对他人有所帮助

问候,

安德里安