澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

太阳集团太阳娱乐登录OData V4 系列 Action 与 Fun
分类:脚本专栏

OData 学习目录

       OData 学习目录

 

刺探过WebApi的都了然,WebApi私下认可方法 Get、Post、Put,若是扩张另外过多Post方法即不能够识别,还需扩大其余配制,央浼的Url还需加上Controller及Action,与Restful设计不一致样,Odata能够缓慢解决这样的主题素材。

       精晓过WebApi的都理解,WebApi暗中同意方法 Get、Post、Put,假若增添其余过多Post方法即不能够识别,还需增添另外配制,哀告的Url还需加上Controller及Action,与Restful设计分化,Odata能够消除那样的标题。

本篇体验OData的Action和Function作用。上下文音讯仿照效法"ASP.NET Web API基于OData的增加和删除改查,以及处理实体间事关"。在本文从前,作者存在的吸引包罗:

   配制路由劳务

    配制路由服务       

 

            builder.Namespace = "ProductService";            builder.EntityType<Product>().Collection                .Function("MostExpensive")  //函数路由                .Returns<double>();            builder.Namespace = "ProductService";            builder.EntityType<Product>()                .Action("Rate")  //Action路由                .Parameter<int>("Rating");
            builder.Namespace = "ProductService";
            builder.EntityType<Product>().Collection
                .Function("MostExpensive")  //函数路由
                .Returns<double>();

            builder.Namespace = "ProductService";
            builder.EntityType<Product>()
                .Action("Rate")  //Action路由
                .Parameter<int>("Rating");

● 为何供给OData的Action和Function作用?
● Action和Function之间有怎么着差距?
● 怎样设置OData的的Action和Function作用?那中间有啥样惯例呢?

经过Get央浼 MostExpensive 会出现如下错误
太阳集团太阳娱乐登录 1

         通过Get诉求 MostExpensive 会现身如下错误
         太阳集团太阳娱乐登录 2

 

修改Web.config <modules runAllManagedModulesForAllRequests="true"></modules>

              修改Web.config   <modules runAllManagedModulesForAllRequests="true"></modules>

为某个Product添加Action

太阳集团太阳娱乐登录 3

              太阳集团太阳娱乐登录 4

 

太阳集团太阳娱乐登录 5

太阳集团太阳娱乐登录,              太阳集团太阳娱乐登录 6

只要大家期待经过

Action 请求

               Action 请求              

率先成立产品评价的一个模型:

              $.ajax({                url: "/Odata/Products(" + id + ")/ProductService.Rate",                type: "POST",                contentType: "application/json; charset=utf-8",                dataType: "JSON",                data: JSON.stringify({ Rating: 5 }),                success: function  {                    debugger;                },                error: function  {                    debugger;                }            });
              $.ajax({
                url: "/Odata/Products(" + id + ")/ProductService.Rate",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataType: "JSON",
                data: JSON.stringify({ Rating: 5 }),
                success: function (r) {
                    debugger;
                },
                error: function (e) {
                    debugger;
                }
            });

 

 

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
Update-Database  -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上不允许带点,否则会返回404
builder.EntityType<Product>()
    .Action("Rate")//给EDM添加一个Action
    .Parameter<int>("Rating"); //Rating作为参数在前后端传递



config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "odata", 
    model:builder.GetEdmModel());

 

以上,

● 通过builder.Namespace定义了Action的命名空间为ProductService
● 通过Action方法给Product这个EDM定义了Rate这个Action
● 通过Parameter<T>方法定义了参数

那表示:

● 大家发出的伸手格式大概是:
● API的action方法中,action名称是Rate,能够在此以前端接受三个称呼为Rating的键值

可难题还恐怕有:

● 前端怎么着把Rating这几个参数字传送递出去吗?
● 后端又如何接受那个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);

}

 

可知,后端是由此ODataActionParameters来经受前端传来的变量Rating。

近日前端能够试着发出供给了:

POST
Body {"Rating":5}

咱俩把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>

 

再一次央求,重回:204 No Content

 

为Product集结增加Action

 

假若想为Products集结加多如下方法爆发如下央求:

首先照旧安排EDM:

 

builder.EntityType<Product>().Collection
        .Function("MostExpensive")
        .Returns<double>();

 

在ProductsController中增多如下Action:

 

[HttpGet]
public IHttpActionResult MostExpensive()
{
    var product = db.Products.Max(x => x.Price);
    return Ok(product);
}

 

前端诉求:

GET
返回:
{
  "@odata.context": "",
  "value": 18.2
}

和EDM模型非亲非故,加多Function

当我们须要增添三个与EDM 模型毫不相关的点猪时候,就使用Function。

首先在WebApi.config中布局如下:

 builder.Function("GetSalesTaxRate")
            .Returns<double>()
            .Parameter<int>("PostalCode");

 

在某些Controller中增加如下:

 

[HttpGet]
[ODataRoute("GetSalesTaxRate(PostalCode={postalCode})")]
public IHttpActionResult GetSalesTaxRate([FromODataUri] int postalCode)
{
    double rate = 5.8;
    return Ok(rate);
}

 

如上,ODataRoute设定路由法规。前端发出如下伏乞:

GET )
返回:

{
  "@odata.context": "",
  "value": 5.8
}

计算:当须求针对某些EDM模型或EDM模型集结举办CRUD以外的操作,乃至涉及八个模型的操作使用Action,但丰盛和EDM模型非亲非故的操作,使用Function。

 

本文由澳门太阳娱乐集团官网发布于脚本专栏,转载请注明出处:太阳集团太阳娱乐登录OData V4 系列 Action 与 Fun

上一篇:IL指令速查 下一篇:太阳集团太阳娱乐登录【python】Python 中的 class
猜你喜欢
热门排行
精彩图文