对于在ASP.NET WebAPI中怎么使用OData,
已经在我前面的日志中的说明,

在ASP.NET Web API中使用OData

在这个示例中。我新建了一个Order的实体,
在前端使用Angular进行增加,删除,修改,查询,分页

下面是Order的实体结构,有No,Total,Data3个属性
public class Order
{
    public int Id { get; set; }
    public string No { get; set; }
    public decimal Total { get; set; }
    public DateTime Date { get; set; }
}
然后我们对其进行OData路由进行注册
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Order>("Orders");
config.MapODataServiceRoute("ODataRoute", null, builder.GetEdmModel());

再创建OData的WebAPI Controller

然后我们用Code First生成到数据库
这样。我们就可以对基进行测试,(这里测试用的是Postman工具)
1。增加一个Order

查询这个Order

修改这个Order

删除这个Order

一切都是正常运行

接下来我们构建前端AngularJS
开始我们在页面引用AngularJS
<script src="Scripts/angular.js"></script>
然后申明一个Module
var mainModule = angular.module("MainApp", []);
因为WebAPI我们可以把他看成一个服务,所以我们可以这样写

  1. //申明Module
  2. var mainModule = angular.module("MainApp", []);
  3. //创建Order的增删改查Angular服务
  4. mainModule.service("Order", ["$rootScope", "$http", function ($rootScope, $http) {
  5. //page:当前页码
  6. //filter:查询条件
  7. var service = { orders: [], page: 1, filter: "" };
  8. //根据页码,查询条件,拿到当前的Orders集合
  9. service.getOrders = function () {
  10. //OData可以通过odata/Orders?$skip=分页跳过的记录数&$filter=查询条件
  11. //通过这样的GET请求,可以拿到当前查询条件下的第几页数据
  12. $http.get("odata/Orders?$skip=" + ((this.page - 1) * 3).toString() + this.filter)
  13. .success(function (data, status, headers, config) {
  14. service.orders = data.value;
  15. //setvice.nextLink = data["@odata.nextLink"];
  16. $rootScope.$broadcast('orders.update');
  17. })
  18. .error(function (data, status, headers, config) { });
  19. };
  20. //增加Order,传入Order对象Post到odata/Orders
  21. service.addOrder = function (order) {
  22. $http.post("odata/Orders", order)
  23. .success(function (data, status, headers, config) {
  24. service.orders.push(data);
  25. })
  26. .error(function (data, status, headers, config) { });
  27. };
  28. //删除Order,用Delete请求odata/Orders(id)
  29. service.deleteOrder = function (id) {
  30. $http.delete("odata/Orders(" + id + ")")
  31. .success(function (data, status, headers, config) {
  32. service.getOrders();
  33. })
  34. .error(function (data, status, headers, config) { });
  35. };

接下来声明Controller

  1. //申明Order Controller,注入Order服务
  2. mainModule.controller("orderList", ["$scope", "Order", function ($scope, Order) {
  3. $scope.$on("orders.update", function (event) {
  4. $scope.orders = Order.orders;
  5. })
  6. //增加的order对象
  7. $scope.order = {};
  8. //修改的order对象
  9. $scope.uOrder = {};
  10. //对列表进行查询的对象
  11. $scope.whereOrder = {};
  12. //上一页
  13. $scope.goBefore = function () {
  14. if (Order.page > 1) {
  15. Order.page -= 1;
  16. Order.filter = $scope.getFilterString();
  17. Order.getOrders();
  18. }
  19. }
  20. //下一页
  21. $scope.goNext = function () {
  22. Order.page += 1;
  23. Order.filter = $scope.getFilterString();
  24. Order.getOrders();
  25. }
  26. //得到根据查询条件拿到Order
  27. $scope.getOrders = function () {
  28. Order.filter = $scope.getFilterString();
  29. Order.getOrders();
  30. }
  31. //生成查询条件字符串
  32. $scope.getFilterString = function () {
  33. var filterString = "&$filter=";
  34. var filterArray = [];
  35. if ($scope.whereOrder.No != undefined && $scope.whereOrder.No!="") filterArray.push("No eq '" + $scope.whereOrder.No + "'");
  36. if ($scope.whereOrder.geTotal != undefined && $scope.whereOrder.geTotal.toString() != "") filterArray.push("Total ge " + $scope.whereOrder.geTotal);
  37. if ($scope.whereOrder.leTotal != undefined && $scope.whereOrder.leTotal.toString() != "") filterArray.push("Total le " + $scope.whereOrder.leTotal);
  38. filterString += filterArray.join(" and ");
  39. if (filterString == "&$filter=") filterString = "";
  40. console.log(filterString);
  41. return filterString;
  42. }
  43. //增加Order,调用上面的Order Service
  44. $scope.addOrder = function () {
  45. Order.addOrder($scope.order);
  46. }
  47. //删除order,调用上面的Order Service
  48. $scope.deleteOrder = function (id) {
  49. Order.deleteOrder(id);
  50. }
  51. //修改order
  52. $scope.editOrder = function (order) {
  53. $scope.uOrder = order;
  54. }
  55. //把修改的Order更新到服务器,调用上面的Order Service
  56. $scope.putOrder = function () {
  57. Order.putOrder($scope.uOrder)
  58. }
  59. Order.getOrders();
  60. $scope.page = Order.page;
  61. $scope.orders = Order.orders;
  62. }]);

对应的HTML Templater,由于使用纯HTML写,所以CSS就没有了

  1. <body ng-app="MainApp">
  2. <div ng-controller="orderList">
  3. <fieldset>
  4. <legend>List Orders</legend>
  5. <div>
  6. <span>查询条件</span>
  7. No:<input type="text" ng-model="whereOrder.No" />
  8. Total:<input type="number" ng-model="whereOrder.geTotal" />
  9. <input type="number" ng-model="whereOrder.leTotal" />
  10. <input type="button" value="Search" ng-click="getOrders()" />
  11. </div>
  12. <table border="1">
  13. <thead>
  14. <tr>
  15. <th>ID</th>
  16. <th>No</th>
  17. <th>Total</th>
  18. <th>Date</th>
  19. <th colspan="2">Action</th>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. <tr ng-repeat="item in orders">
  24. <td>{{item.Id}}</td>
  25. <td>{{item.No}}</td>
  26. <td>{{item.Total}}</td>
  27. <td>{{item.Date | date : 'yyyy-MM-dd'}}</td>
  28. <td><a href="#nogo" ng-click="editOrder(item)">Edit</a></td>
  29. <td><a href="#nogo" ng-click="deleteOrder(item.Id)">Delete</a></td>
  30. </tr>
  31. </tbody>
  32. </table>
  33. <div>
  34. <input type="button" ng-click="goBefore()" value="上一页" />
  35. <input type="button" ng-disabled="orders.length<3" ng-click="goNext()" value="下一页" />
  36. </div>
  37. </fieldset>
  38. <fieldset>
  39. <legend>Add Order</legend>
  40. <div>
  41. <span>No:</span><input type="text" ng-model="order.No" /><br />
  42. <span>Total:</span><input type="number" ng-model="order.Total" /><br />
  43. <span>Date:</span><input type="date" ng-model="order.Date" /><br />
  44. <input type="button" ng-click="addOrder()" value="Add Order" />
  45. </div>
  46. </fieldset>
  47. <fieldset>
  48. <legend>Update Order</legend>
  49. <div>
  50. <input type="hidden" ng-model="uOrder.Id" />
  51. <span>No:</span><input type="text" ng-model="uOrder.No" /><br />
  52. <span>Total:</span><input type="number" ng-model="uOrder.Total" /><br />
  53. <span>Date:</span><input type="date" ng-model="uOrder.Date" /><br />
  54. <input type="button" ng-click="putOrder()" value="Update Order" />
  55. </div>
  56. </fieldset>
  57. </div>
  58. </body>

然后运行页面,得到如下效果

增加Order

查询Order

过滤Order

删除ID为1的Order


分页查询


源代码下载
Demo1_20150708214657.rar
引用资源
http://www.asp.net/web-api
Supporting OData Query Options in ASP.NET Web API 2
转载请注明出处
http://giantliu.com/

基于Angular+WebAPI+OData的增删改查的更多相关文章

  1. ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...

  2. [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系

    本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...

  3. 初试KONCKOUT+WEBAPI简单实现增删改查

    初试KONCKOUT+WEBAPI简单实现增删改查 前言 konckout.js本人也是刚刚接触,也是初学,本文的目的是使用ko和asp.net mvc4 webapi来实现一个简单增删改查操作.Kn ...

  4. 基于vue-easytable实现数据的增删改查

    基于vue-easytable实现数据的增删改查 原理:利用vue的数据绑定和vue-easetable的ui完成增删改查 后端接口: 1.条件查询表中数据 http://localhost:4795 ...

  5. MyBatis学习(三)MyBatis基于动态代理方式的增删改查

    1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...

  6. webapi初学项目(增删改查)

    初学wenapi做了一个从数据库增删改查的项目 webapi: 1.创建项目:visual C# —> ASP.NET MVC 4 web应用程序 模板—>web api; 2.注册路由: ...

  7. 基于SpringMVC的文件(增删改查)上传、下载、更新、删除

    一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...

  8. (转)初试konckout+webapi简单实现增删改查

    原文地址:http://www.cnblogs.com/flykai/p/3361064.html 前言 konckout.js本人也是刚刚接触,也是初学,本文的目的是使用ko和asp.net mvc ...

  9. webapi初学项目(增删改查),webapi增删

    wenapi做了一个从数据库增删改查的项目 webapi: 1.创建项目:visual C# —> ASP.NET MVC 4 web应用程序 模板—>web api; 2.注册路由: 路 ...

随机推荐

  1. Django 使用模型的API

    进入项目目录 python3运行 import os os.environ['DJANGO_SETTINGS_MODULE']= '项目.settings' import django django. ...

  2. 使用wxpy自动发送微信消息

    思路整理:1.进入心灵鸡汤网页,使用python获取心灵鸡汤内容 2.登陆微信,找到需要发送的朋友 3.发送获取的内容 1.获取心灵鸡汤的内容 如下图,获取第一条鸡汤 实现如下: 2.登陆微信,搜索朋 ...

  3. 洗礼灵魂,修炼python(48)--巩固篇—模块

    模块 其实前面都说过的,不过还是系统的再说一次,相信学到这,大部分都被搞忘了吧,所以再提一下,也为后面的博文做铺垫 1.什么是模块 在程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越 ...

  4. Linux之删除带有空格的文件(而不是目录)

    大家平时工作中对不带空格的文件接触较多.这样一来删除操作也是比较简单的.但是有时我们会接触带有空格的文件.对于这种文件我们应该如何删除呢? 首先我们演示一下find命令结合xargs命令删除不带空格的 ...

  5. 浅copy与深copy举例

     例1: #!/usr/bin/env python import copy d1 = {'x':1,'y':2,'z':[3,4.5]} d2 = d1 d3 = d1.copy() d4 = co ...

  6. 房企大裁员;争议贺建奎;破产阴影下的ofo:4星|《财经》第29期

    <财经>2018年第29期 总第546期 旬刊 高水平的财经杂志.本期重要话题有:1:房企大裁员;2:争议贺建奎;3:破产阴影下的ofo; 总体评价4星,非常好. 以下是书中一些内容的摘抄 ...

  7. vue中使用baidushare分享到微信无法显示bug解决方案

    最近vue单页面项目中有个页面分享的功能需求,按以往经验,选择了百度开源的baidushare.js 经过一天的挣扎,终于弄清楚了分享到微信后无法显示的原因. 对比分析: 以往成功使用:另写了一个专门 ...

  8. vue-cli打包到部署到nginx服务器

    最近公司把云平台产品用vue 前后端分离的框架来写,前面大部分开发都比较顺利,后面打包部署出了bug 现在记录下自己遇到的哪些坑 1,我直接npm run build 打包出来,打开dist目录下面的 ...

  9. 【转】字符编码笔记:ASCII、Unicode、UTF-8 和 Base64

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态(-128~127),这被称为一 ...

  10. 转载 【.NET基础】--委托、事件、线程(3)

      之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...