通过ASP.NET Web API + JQuery创建一个简单的Web应用

简介:

看了dudu的《HttpClient + ASP.NET Web API, WCF之外的另一个选择》一文,想起多很久之前体现ASP.NET Web API而创建的一个Demo。这是一个只涉及到简单CRUD操作的Web应用,业务逻辑以Web API的形式定义并以服务的形式发布出来,前台通过jQuery处理用户交互并调用后台服务。[源代码从这里下载]

目录
一、一个简单的基于CRUD
二、通过ASP.NET Web API提供服务
三、通过JQuery消费服务

一、一个简单的基于CRUD的Web应用

这个简单的Demo应用用于模拟“联系人管理”。当页面加载的时候,所有的联系人列表被列出来。在同一个页面中,我们可以添加一个新的联系人,也可以修改和删除现有联系人信息。整个应用唯一的页面在浏览器中的呈现效果如下图所示。

image

二、通过ASP.NET Web API提供服务

我们来简单介绍作为Web API形式发布的联系人管理服务的定义,先来看看用于表示联系人的Contact类型的定义。

   1: public class Contact
   2: {
   3:     public string Id { get; set; }
   4:     public string FirstName { get; set; }
   5:     public string LastName { get; set; }
   6:     public string PhoneNo { get; set; }
   7:     public string EmailAddress { get; set; }
   8: }

“联系人服务”以具有如下定义的ContactController的形式定义,它是ApiController的子类。简单起见,我们采用静态字段作为对联系人信息的存储。ContactController定义了Get、Put、Post和Delete用于进行对联系人的获取、添加、修改和删除操作。我想对Web API不了解的人会感概,为了什么采用常用的四个HTTP方法作为操作的名称,因为它们在默认的情况下就可以映射为HTTP请求的方法。

   1: public class ContactController : ApiController
   2: {
   3:     private static List<Contact> contacts = new List<Contact>
   4:     {
   5:         new Contact{ Id="001", FirstName = "San", LastName="Zhang", PhoneNo="123", EmailAddress="zhangsan@gmail.com"},
   6:         new Contact{ Id="002",FirstName = "Si", LastName="Li", PhoneNo="456", EmailAddress="lisi@gmail.com"}
   7:     };
   8:         
   9:     public IEnumerable<Contact> Get()
  10:     {
  11:         return contacts;
  12:     }
  13:  
  14:     public Contact Get(string id)
  15:     {
  16:         return contacts.FirstOrDefault(c => c.Id == id);
  17:     }
  18:  
  19:     public void Put(Contact contact)
  20:     {
  21:         if (string.IsNullOrEmpty(contact.Id))
  22:         {
  23:             contact.Id = Guid.NewGuid().ToString();
  24:         }
  25:         contacts.Add(contact);
  26:     }
  27:  
  28:     public void Post(Contact contact)
  29:     {
  30:         Delete(contact.Id);
  31:         contacts.Add(contact);
  32:     }
  33:  
  34:     public void Delete(string id)
  35:     {
  36:         Contact contact = contacts.FirstOrDefault(c => c.Id == id);
  37:         contacts.Remove(contact);
  38:     }
  39: }

和ASP.NET MVC Web应用一样,我们同样采用URL路由机制来实现请求地址与目标Controller和Action的映射,而针对API默认注册的路有如下所示。

   1: public class MvcApplication : System.Web.HttpApplication
   2: {
   3:     //...
   4:     public static void RegisterRoutes(RouteCollection routes)
   5:     {
   6:          //...
   7:         routes.MapHttpRoute(
   8:             name: "DefaultApi",
   9:             routeTemplate: "api/{controller}/{id}",
  10:             defaults: new { id = RouteParameter.Optional }
  11:         );
  12: }

按照注册的路由规则和Action方法名称与HTTP方法的默认影射机制,我们可以直接在浏览器中分别访问地址“/api/contact”和“/api/contact/001”得到所有联系人列表和ID为“001”的联系人信息。得到的结果如下图所示。

image

三、通过JQuery消费服务

我们通过ASP.NET MVC来构建Web应用,默认的HomeController定义如下,默认的Index操作仅仅是将默认的View呈现出来而已。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7: }

View中对用户操作的相应和对后台服务的调用都通过JQuery来完成,整个View的定义如下所示。

   1: <script type="text/javascript">
   1:  
   2:     $(function () {
   3:         loadAllContacts();
   4:        }
   5:      )
   6:  
   7:     function loadAllContacts() {
   8:         $.ajax({
   9:             url     : "api/contact",
  10:             type    : "GET",
  11:             dataType: "json",
  12:             success : function (data) { renderContactList(data) }
  13:            }
  14:         );        
  15:     }
  16:  
  17:     function renderContactList(contacts) {
  18:         var html = "<table>";
  19:         html += "<tr><th>First Name</th><th>Last Name</th><th>Phone No.</th><th>Email Address</th><th></th></tr>";
  20:         for (i = 0; i < contacts.length; i++) {
  21:             html += "<tr><td>" + contacts[i].FirstName + "</td><td>"
  22:                  + contacts[i].LastName + "</td><td>" + contacts[i].PhoneNo + "</td><td>"
  23:                  + "<input type=\"text\" class=\"textbox long\" id=\"" + contacts[i].Id + "\" value =\"" + contacts[i].EmailAddress + "\"/>" + "</td><td>"
  24:                  + "<a href=\"#\" onclick = \"updateContact('" + contacts[i].Id + "')\">Update</a> &nbsp;&nbsp;&nbsp;&nbsp;"
  25:                  + "<a href=\"#\" onclick = \"deleteContact('" + contacts[i].Id + "')\">Delete</a>" + "</td></tr>";
  26:         }
  27:         html += "<tr><td>" + "<input id=\"firstName\" type=\"text\" class=\"textbox\"/>" + "</td><td>"
  28:             + "<input id=\"lastName\" type=\"text\" class=\"textbox\"/>" + "</td><td>"
  29:             + "<input id=\"phoneNo\" type=\"text\" class=\"textbox\"/>" + "</td><td>"
  30:             + "<input id=\"emailAddress\" type=\"text\" class=\"textbox long\"/>" + "</td><td>" 
  31:             + "<a href=\"#\" id=\"add\" onclick=\"addContact();\">Create</a> " + "</td></tr>";
  32:         html += "</table>";
  33:         $("#contacts").html(html);
  34:         $("table tr:odd").addClass("oddRow");
  35:     }
  36:  
  37:     function deleteContact(id) {
  38:         $.ajax({
  39:             url     : "api/contact/" + id,
  40:             type    : "DELETE",
  41:             success : function () { loadAllContacts();}
  42:         });
  43:     }
  44:  
  45:     function updateContact(id) {
  46:         var emailAddress = $("#" +id).attr("value");
  47:         $.ajax({
  48:             url     : "api/contact/" + id,
  49:             type    : "GET",
  50:             success : function (contact) {
  51:                 contact.EmailAddress = emailAddress;
  52:                 update(contact);
  53:             }
  54:         });
  55:     }
  56:  
  57:     function update(contact) {
  58:         $.ajax({
  59:             url         : "api/contact/",
  60:             type        : "POST",
  61:             data        : contact,
  62:             contentType : "application/json",
  63:             success     : function () { loadAllContacts(); }
  64:         });
  65:     }
  66:  
  67:     function addContact() {
  68:         var contact = new Object();
  69:         contact.FirstName       = $("#firstName").attr("value");
  70:         contact.LastName        = $("#lastName").attr("value");
  71:         contact.PhoneNo         = $("#phoneNo").attr("value");
  72:         contact.EmailAddress    = $("#emailAddress").attr("value");
  73:         $.ajax({
  74:             url         : "api/contact/",
  75:             type        : "PUT",
  76:             data        : contact,
  77:             contentType : "application/json",
  78:             success     : function () { loadAllContacts(); }
  79:         });
  80:     }
</script>
   2: <div id="contacts"></div>

作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
1月前
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
171 3
|
22天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
53 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
1月前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
2月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
57 1
|
2月前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
134 2
|
3月前
|
监控 负载均衡 API
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
62 2
|
3月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
111 9
|
3月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
57 2