本篇体验OData的Action和Function功能。上下文信息参考"ASP.NET Web API基于OData的增删改查,以及处理实体间关系"。在本文之前,我存在的疑惑包括: ● 为什么需要OData的Action和Function功能?● Acti ...
本篇体验OData的Action和Function功能。上下文信息参考"get='_blank'>ASP.NET Web API基于OData的增删改查,以及处理实体间关系"。在本文之前,我存在的疑惑包括:
● 为什么需要OData的Action和Function功能?首先创建产品评论的一个模型:
public class ProductRating{ public int ID { get; set; } public int Rating { get; set; } public int ProductID { get; set; } public virtual Product Product { get; set; }}
public class ProductsContext : DbContext{ public ProductsContext() : base("name=ProductsContext") { } public DbSet<Product> Products { get; set; } public DbSet<Supplier> Suppliers { get; set; } public DbSet<ProductRating> Ratings { get; set; }}
Add-Migration "AddProductRating" -StartUpProjectName ProductService -ProjectName ProductService现在,需要在WebApiConfig.cs中的Register方法中,为Product的EDM添加一个Action。
ODataModelBuilder builder = new ODataConventionModelBuilder();builder.Namespace = "ProductService";builder.EntitySet<Product>("Products");//创建EntityDataModel(EDM)builder.EntitySet<Supplier>("Suppliers");//http://localhost/Products(1)/ProductService.Rate 注意需要在Web.config中添加配置,因为在IIS上不允许带点,否则会返回404builder.EntityType<Product>() .Action("Rate")//给EDM添加一个Action .Parameter<int>("Rating"); //Rating作为参数在前后端传递config.MapODataServiceRoute( routeName: "ODataRoute", routePrefix: "odata", model:builder.GetEdmModel());
● 通过builder.Namespace定义了Action的命名空间为ProductService这意味着:● 我们发出的请求格式大致是:http://localhost:54714/odata/Products(1)/ProductService.Rate可问题还有:●
前端如何把Rating这个参数传递出去呢?来看后端控制器部分的action,在ProductsController中添加如下:
//这里的action名称Rate必须和EDM定义的时候保持一致[HttpPost]public async Task<IHttpActionResult> Rate([FromODataUri] int key, ODataActionParameters parameters){ //先验证 if(!ModelState.IsValid) { return BadRequest(); } //再取值 int rating = (int)parameters["Rating"]; //实施操作 db.Ratings.Add(new ProductRating { ProductID = key, Rating = rating }); //捕获异常 try { await db.SaveChangesAsync(); } catch (DbUpdateException ex) { if (!ProductExists(key)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent);}
现在前端可以试着发出请求了:POST http://localhost:54714/odata/Products(1)/ProductService.Rate我们把Rating变量放在了Body中,以json传递给后端。可是,返回结果是: 404 Not Found这是因为,IIS还不接受类似ProductService.Rate这样的写法,在Web.config添加如下配置:
<system.webServer><handlers> ... <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="/odata/*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /></handlers></system.webServer>
首先还是配置EDM:
builder.EntityType<Product>().Collection .Function("MostExpensive") .Returns<double>();
GET http://localhost:54714/odata/Products/ProductService.MostExpensive
和EDM模型无关,添加Function当我们需要添加一个与EDM 模型无关的方法时候,就使用Function。首先在WebApi.config中配置如下:
builder.Function("GetSalesTaxRate") .Returns<double>() .Parameter<int>("PostalCode");
GET http://localhost:54714/odata/GetSalesTaxRate(PostalCode=10){
原标题:在ASP.NET Web API中使用OData的Action和Function
关键词:ASP.NET
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。