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')); }); }); }
希望这会对他人有所帮助
问候,
安德里安