版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1章 .实例快速上手 -ASP.NET 4.5新特性WebAPI从入门到精通 在新出的MVC4中,增加了WebAPI,用于提供REST风格的WebService,新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models、Views、Controllers等文件夹和Global.asax文件。Views对于WebAPI来说没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认情况下会被转换为Json格式的数据迚行传输,Controllers中的Controller对应于WebService来说是一个Resource,用于提供服务
2、。和普通的MVC一样,Global.asax用于配置路由规则。(1) 环境准备 建议使用VS2012以上版本创建WebAPI,如果是使用VS2010,需要安装VS2010 SP1升级包,MVC4升级包,打开VS2012创建如下:第一步:新建ASP.NET Web应用程序第二步:建议WebAPI新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models,Views,Controllers等文件夹和Global.asax文件注意:再次强调Views对于WebAPI来说没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认情况下会被转换
3、为Json格式的数据进行传输,Controllers中的Controller对应于WebService来说是一个Resource,用于提供服务。和普通的MVC一样,Global.asax用于配置路由规则(二)Models和WCF中的数据契约形成鲜明对比的是,MVC WebAPI中的Model就是简单的POCO,没有任何别的东西,如,你可以创建如下的Model public class UserModel public int Id get; set; public string UserName get; set; public string PassWord get; set; 注意:Mod
4、el必须提供public的属性,用于json或xml反序列化时的赋值(三)ControllersMVC WebAPI中的Controllers和普通MVC的Controllers类似,不过不再继承于Controller,而改为继承API的ApiController,一个Controller可以包含多个Action,这些Action响应请求的方法与Global中配置的路由规则有关,在后面结束Global时统一说明(四)Global默认情况下,模板自带了两个路由规则,分别对应于WebAPI和普通MVC的Web请求,默认的WebAPI路由规则如下1 routes.MapHttpRoute(2 nam
5、e: DefaultApi,3 routeTemplate: api/controller/id,4 defaults: new id = RouteParameter.Optional 5 );可以看到,默认路由使用的固定的api作为Uri的先导,按照微软官方的说法,用于区分普通Web请求和WebService的请求路径:可以看到,默认的路由规则只指向了Controller,没有指向具体的Action,因为默认情况下,对于Controller中的Action的匹配是和Action的方法名相关联的:具体来说,如果使用上面的路由规则,对应下面的Controller:public class Us
6、erController : ApiController public List allModeList = new List() new UserModel() Id=1,UserName=zhang, PassWord=123, new UserModel() Id=2,UserName=lishi, PassWord=123456, new UserModel() Id=3,UserName=wang, PassWord=1234567 ; /Get api/User/ public IEnumerable GetAll() return allModeList; /Get api/Us
7、er/1 public IEnumerable GetOne(int id) return allModeList.FindAll(m) = return m.Id = id; ); /POST api/User/ public bool PostNew(UserModel user) try allModeList.Add(user); return true; catch return false; /Delete api/User/ public int DeleteAll() return allModeList.RemoveAll(mode) = return true; ); /D
8、elete api/User/1 public int DeleteOne(int id) return allModeList.RemoveAll(m) = return m.Id = id; ); /Put api/User public int PutOne(int id, UserModel user) List upDataList = allModeList.FindAll(mode) = return mode.Id = id; ); foreach (var mode in upDataList) mode.PassWord = user.PassWord; mode.User
9、Name = user.UserName; return upDataList.Count; 则,会有下面的对应关系: URL HttpMethod 对应的Action名 /api/User GET GetALL /api/User/1 GET GetOne /api/User POST PostNew /api/User/1 DELETE DeleteOne /api/User DELETE DeleteALL /api/User PUT PutOne(5) 客户端JS调用 function getAll() $.ajax( url: api/User/, type: GET, succes
10、s: function (data) document.getElementById(modes).innerHTML = ; $.each(data, function (key, val) var str = val.UserName + : + val.PassWord; $(, html: str ).appendTo($(#modes); ); ).fail( function (xhr, textStatus, err) alert(Error: + err); );function find() $.ajax( url: api/User/1 , type: GET, succe
11、ss: function (data) document.getElementById(modes).innerHTML = ; $.each(data, function (key, val) var str = val.UserName + : + val.PassWord; $(, html: str ).appendTo($(#modes); ); ).fail( function (xhr, textStatus, err) alert(Error: + err); ); function add() $.ajax( url: api/User/, type: POST, dataT
12、ype: json, data: Id:4,UserName: admin, PassWord: 666666, success: function (data) getAll(); ).fail( function (xhr, textStatus, err) alert(Error: + err); ); function removeUser() $.ajax( url: api/User/3, type: DELETE, success: function (data) document.getElementById(modes).innerHTML = ; getAll(); ).f
13、ail( function (xhr, textStatus, err) alert(Error: + err); ); function removeAll() $.ajax( url: api/User/, type: DELETE, success: function (data) document.getElementById(modes).innerHTML = ; getAll(); ).fail( function (xhr, textStatus, err) alert(Error: + err); ); function udpate() $.ajax( url: api/U
14、ser/1, type: PUT, dataType: json, data: Id: 1, UserName: admin, PassWord: 666666 , success: function (data) document.getElementById(modes).innerHTML = ; getAll(); ).fail( function (xhr, textStatus, err) alert(Error: + err); ); 这样就实现了最基本的CRUD操作。扩展需求问题1:我想按照用户名称(UserName)进行查询,怎么办?办法:第一步:在UserControlle
15、r类中加一个方法名称叫:GetUserByName,如下所示: public UserModel GetUserByName(string userName) return allModeList.Find(m) = return m.UserName.Equals(userName); );第二步:在客户端index.cshtml中调用 function getUserByName() $.ajax( url: api/User/zhang, type: GET, success: function (data) document.getElementById(modes).innerHTM
16、L = ; var str = data.UserName + : + data.PassWord; $(, html: str ).appendTo($(#modes); ).fail( function (xhr, textStatus, err) alert(Error: + err); );如果URL是: url: api/User/zhang,将会报错:Bad Request原因是他会自动调用我们的GetOne(int id) 这个方法,类型转换出错解决办法:改变URL为: url: api/User/?userName=zhang,问题2:我想按用户名称(UserName) 和用户
17、密码(PassWord)一起来进行查询,怎么办?解决办法第一步:UserController类中,可以重载一个GetUserByName的方法,如下所示: public UserModel GetUserByName(string userName) return allModeList.Find(m) = return m.UserName.Equals(userName); ); 第二步:客户端调用: function getUserByName() $.ajax( url: api/User/?userName=zhang&passWord=123, /这里尤其需要注意 type: GE
18、T, success: function (data) document.getElementById(modes).innerHTML = ; var str = data.UserName + : + data.PassWord; $(, html: str ).appendTo($(#modes); ).fail( function (xhr, textStatus, err) alert(Error: + err); );(6) 路由规则扩展和普通的MVC一样,MVC WebAPI支持自定义的路由规则,如:在上面的操作中,路由规则使用api/controller/id则限定了使用GET
19、方式利用URL来传值时,controller后面的接收参数名为id,但是在Controller中,如果GetOne方法的接收参数名为key,是不会被匹配的,这是只需要新增一个新的路由规则,或修改原先的路由规则为:api/controller/key,如下所示: config.Routes.MapHttpRoute( name: DefaultApi, routeTemplate: api/controller/key, defaults: new key = RouteParameter.Optional );当然,可以对路由进行更深的扩展,如:扩展成和普通MVC一样的路由:api/contr
20、oller/action/id这样,就要求同时使用Action和HTTP方法进行匹配当然,根据微软的说法,这种使用是不被推荐的,因为这不符合大家对WebService的一般认知:(7) 使用Attribute声明HTTP方法 HttpGet public IEnumerable FindAll() HttpGet public IEnumerable FindByKey(string key) HttpPost public bool Add(TestUseMode mode) HttpDelete public int RemoveByKey(string key) HttpDelete p
21、ublic int RemoveAll() HttpPut public int UpdateByKey(string key, string value) NonAction public string GetPrivateData()当然,我只列出了方法名,而不是这些方法真的没有方法体.方法体是不变的,NoAction表示这个方法是不接收请求的,即使以GET开头。如果感觉常规的GET,POST,DELETE,PUT不够用,还可以使用AcceptVerbs的方式来声明HTTP方法,如:AcceptVerbs(MKCOL, HEAD)public int UpdateByKey(string
22、key, string value) List upDataList = allModeList.FindAll(mode) = if (mode.ModeKey = key) return true; return false; ); foreach(var mode in upDataList) mode.ModeValue = value; return upDataList.Count;附:什么是REST风格? 参考:什么是REST风格第二部分:综合示例:应用ASP.NET MVC4+WebAPI+FluentData开发Web应用第一步:创建数据库NorthWind数据库的Custo
23、mers表Create DataBase NorthWindGoUse NorthWindGoCREATE TABLE dbo.Customers(CustomerID nchar(5) NOT NULL,CompanyName nvarchar(40) NOT NULL,ContactName nvarchar(30) NULL,ContactTitle nvarchar(30) NULL,Address nvarchar(60) NULL,City nvarchar(15) NULL,Region nvarchar(15) NULL,PostalCode nvarchar(10) NULL
24、,Country nvarchar(15) NULL,Phone nvarchar(24) NULL,Fax nvarchar(24) NULL, CONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (CustomerID ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY) ON PRIMARYGO第二步:创建 FluentData.En
25、tity层,创建Customer实体类namespace FluentData.Entity public class Customer public string CustomerID get; set; public string CompanyName get; set; public string ContactName get; set; public string ContactTitle get; set; public string Address get; set; public string City get; set; public string Region get;
26、set; public string PostalCode get; set; public string Country get; set; public string Phone get; set; public string Fax get; set; 第三步:利用FluentData做数据的持久化首先引入FluentData.cs (见附件)其次:创建DBHelper类,代码如下: public class DBHelper public static IDbContext Context() /return new DbContext().ConnectionString(serve
27、r=;uid=sa;pwd=sa;database=TestDB, new SqlServerProvider(); return new DbContext().ConnectionStringName(connString, new SqlServerProvider(); 然后不要忘记修改ASP.NET MVC层所在的Web.config,加入数据库连结字符串: 第三步:创建 CustomerService数据持久化类,代码如下:public class CustomerService private IDbContext context = DBHelper.Cont
28、ext(); public Customer Select(string customerId) return context.Select(*).From(Customers).Where(CustomerID=0).Parameters(customerId) .QuerySingle(); public List SelectAll() return context.Select(*).From(Customers).QueryMany(); public List SelectAll(string sortExpression) if (String.IsNullOrEmpty(sor
29、tExpression) return null; return context.Select(*).From(Customers).OrderBy(sortExpression).QueryMany(); public List SelectAll(int currentPageIndex,int maxRows, string sortExpression) var select = context.Select(*).From(Customers); if (maxRows 0) if (currentPageIndex = 0) currentPageIndex = 1; select
30、.Paging(currentPageIndex, maxRows); if (!string.IsNullOrEmpty(sortExpression) select.OrderBy(sortExpression); return select.QueryMany(); public int CountAll() return context.Sql(select count(*) from Customers).QuerySingle(); public int Insert(Customer customer) return context.Insert(Customers, custo
31、mer).Execute(); public int Update(Customer customer) return context.Update(Customers, customer).Where(CustomerID, customer.CustomerID).Execute(); public int Delete(string customerId) return context.Delete(Customers).Where(CustomerID, customerId).Execute(); public int Delete(Customer customer) return
32、 this.Delete(customer.CustomerID); 第四步:Web API,创建CustomerController注意要引用:FluentData.Entity及FluentData.DAL 程序集public class CustomerController : ApiController private CustomerService customerService = new CustomerService(); /Select All public IEnumerable Get() return customerService.SelectAll(); /Sele
33、ct By Id public Customer Get(string id) return customerService.Select(id); /Insert public void Post(Customer customer) customerService.Insert(customer); /Update public void Put(string id, Customer obj) customerService.Update(obj); /Delete public void Delete(string id) customerService.Delete(id); 第五步
34、:View层代码namespace MyWebApI.Controllers public class HomeController : Controller public ActionResult Index() return View(); public ActionResult Test() return View(); public ActionResult CustomerManager() return View(); 然后创建View Customer ID Company Name Contact Name Country Actions $(function () $.get
35、JSON(api/Customer, LoadCustomers); ); function LoadCustomers(data) $(#customerTable).find(tr:gt(1).remove(); $.each(data, function (key, val) var tableRow = + + val.CustomerID + + + + + + ; $(#customerTable).append(tableRow); ); $(inputname=btnInsert).click(OnInsert); $(inputname=btnUpdate).click(On
36、Update); $(inputname=btnDelete).click(OnDelete); function OnInsert(evt) var customerId = $(#txtCustomerId).val(); var companyName = $(#txtCompanyName).val(); var contactName = $(#txtContactName).val(); var country = $(#txtCountry).val(); var data = CustomerID: + customerId + ,CompanyName: + companyN
37、ame + ,ContactName: + contactName + ,Country: + country + ; $.ajax( type: POST, url: /api/Customer/, data: data, contentType: application/json; charset=utf-8, dataType: json, success: function (results) $(#txtCustomerId).val(); $(#txtCompanyName).val(); $(#txtContactName).val(); $(#txtCountry).val()
38、; $.getJSON(api/customers + new Date().getTime(), LoadCustomers); alert(添加成功!); ).fail( function (xhr, textStatus, err) alert(添加失败,原因如下: + err); ); function OnUpdate(evt) var input; var customerId = $(this).parent().parent().children().get(0).innerHTML; input = $($(this).parent().parent().children().get(1).find(input); /input.removeAttr(disabled); var companyName = input.val(); input = $($(this).parent().parent().children().get(2).find(input
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八项规定手写承诺书范本
- 手足口病防控培训课件
- 2025-2030全球等离子处理设备行业调研及趋势分析报告
- 2025-2030全球医用无纺布电极片行业调研及趋势分析报告
- 2025-2030全球锂电池用隔膜行业调研及趋势分析报告
- 2025年全球及中国发泡奶精行业头部企业市场占有率及排名调研报告
- 2025年全球及中国油炸方便面生产线行业头部企业市场占有率及排名调研报告
- 2025年全球及中国超薄壁PET热缩管行业头部企业市场占有率及排名调研报告
- 2025-2030全球耐高温耐火绝缘砖行业调研及趋势分析报告
- 2025-2030全球卫星锂离子电池行业调研及趋势分析报告
- 房地产调控政策解读
- 五年级数学(小数乘法)计算题专项练习及答案
- 产前诊断室护理工作总结
- 2024-2025学年八年级数学人教版上册寒假作业(综合复习能力提升篇)(含答案)
- 《AP内容介绍》课件
- 医生定期考核简易程序述职报告范文(10篇)
- 市政工程人员绩效考核制度
- 公园景区安全生产
- 安全创新创效
- 《中国糖尿病防治指南(2024版)》更新要点解读
- 初级创伤救治课件
评论
0/150
提交评论