JQuery + ASP.Net Web API一个简单应用

一、使用JQuery + ASP.Net Web API创建一个简单的CRUD应用

该Demo模拟联系人管理(Contact)。页面加载时列出所有的联系人,同时支持增、删、改操作。页面效果如下:

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

通过Visual Studio创建一个Web API项目,在Model中增加表示联系人的Contact,定义如下:

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNo { get; set; }
    public string EmailAddress { get; set; }
} 

在Controllers中增加ContactController,它是ApiController的子类。

该Controller中定义了静态字段contacts,用于存储所有的联系人信息;Get、Put、Post、Delete分别用于获取、增加、修改、删除联系人操作。采用常用的四个HTTP方法作为操作的名称,在默认的情况下可以映射为HTTP请求的方法。

public class ContactController : ApiController
{
    private static List<Models.Contact> contacts = new List<Models.Contact>()
    {
        new Models.Contact { Id="001",FirstName="San",LastName="Zhang",PhoneNo="123",EmailAddress="[email protected]
        new Models.Contact {Id="002",FirstName="Si",LastName="Li",PhoneNo="456",EmailAddress="[email protected]" }
    };

    public IEnumerable<Models.Contact> Get()
    {
        return contacts;
    }

    public Models.Contact Get(string id)
    {
         return contacts.FirstOrDefault(p => p.Id == id);
    }

    public void Put(Models.Contact contact)
    {
        if (string.IsNullOrEmpty(contact.Id))
            contact.Id = Guid.NewGuid().ToString();
        contacts.Add(contact);
    }

    public void Post(Models.Contact contact)
    {
        Delete(contact.Id);
        contacts.Add(contact);
    }
    public void Delete(string id)
    {
        Models.Contact contact = contacts.FirstOrDefault(p => p.Id == id);
        contacts.Remove(contact);
    }
}

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

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    // Configure Web API to use only bearer token authentication.
    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

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

三、通过JQuery创建页面调用Web API

在Controllers中创建新的Controller(Query)同时生成对应的Views(Query-Index.cshtml)

public class QueryController : Controller
{
    // GET: Query
    public ActionResult Index()
    {
        return View();
    }
} 

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

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
<script type="text/javascript">
    $(function () {
        loadAllContacts();
    })

    function loadAllContacts() {
        $.ajax({
            url: "/api/Contact/",
            type: "GET",
            dataType: "JSON",
            success: function (data) { renderContactList(data) }
        });
    }

    function renderContactList(contacts) {
        var html = "<table>";
        html += "<tr><th>First Name</th><th>Last Name</th><th>Phone No.</th><th>Email Address</th><th>Action</th>";
        for (var i = 0; i < contacts.length; i++) {
            html += String.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td>",
                contacts[i].FirstName, contacts[i].LastName, contacts[i].PhoneNo);
            html += String.Format("<td><input type=‘text‘ class=‘textbox long‘ id=‘{0}‘ value=‘{1}‘ /></td>", contacts[i].Id, contacts[i].EmailAddress);
            html += "<td><a href=‘#‘ onclick = ‘updateContact(\"" + contacts[i].Id + "\")‘> Update </a> &nbsp;&nbsp;&nbsp;&nbsp;";
            html += "<a href=‘#‘ onclick = ‘deleteContact(\"" + contacts[i].Id + "\")‘> Delete </a> &nbsp;&nbsp;&nbsp;&nbsp;</td></tr>";
        }
        html += "<tr><td><input id=‘firstName‘ type=‘text‘ class=‘textbox‘</td>" +
            "<td><input id=‘lastName‘ type=‘text‘ class=‘textbox‘</td>" +
            "<td><input id=‘phoneNo‘ type=‘text‘ class=‘textbox‘</td>" +
            "<td><input id=‘emailAddress‘ type=‘text‘ class=‘textbox long‘</td>" +
            "<td><a href=‘#‘ id=‘add‘ onclick=‘addContact()‘> Craete </a></td></tr>";
        html += "</table>";
        $("#contacts").html(html);
        $("table tr:odd").addClass("oddRow");
    }

    function deleteContact(id) {
        $.ajax({
            url: "/api/contact/" + id,
            type: "DELETE",
            success: function () { loadAllContacts(); }
        });
    }

    function updateContact(id) {
        var emailAddress = $("#" + id).val();
        $.ajax({
            url: "/api/Contact/" + id,
            type: "GET",
            dataType: "JSON",
            success: function (contact) {
                contact.EmailAddress = emailAddress;
                alert(emailAddress);
                alert(contact.EmailAddress);
                update(contact);
            },
            error: function (msg) { alert(msg); }
        });
    }

    function update(contact) {
        $.ajax({
            url: "/api/Contact/",
            type: "POST",
            data: JSON.stringify(contact),
            contentType: "application/json",
            success: function () { loadAllContacts(); },
            error: function (msg) { alert(msg); }
        });
    }

    function addContact() {
        var contact = new Object();
        contact.FirstName = $("#firstName").val();
        contact.LastName = $("#lastName").val();
        contact.PhoneNo = $("#phoneNo").val();
        contact.EmailAddress = $("#emailAddress").val();
        $.ajax({
            url: "/api/contact/",
            type: "PUT",
            data: JSON.stringify(contact),
            contentType: "application/json",
            success: function () { loadAllContacts(); }
        });
    }

    String.Format = function () {
        if (arguments.length == 0)
            return null;
        var str = arguments[0];
        for (var i = 1; i < arguments.length; i++) {
            var re = new RegExp(‘\\{‘ + (i - 1) + ‘\\}‘, ‘gm‘);
            str = str.replace(re, arguments[i]);
        }
        return str;
    }
</script>
<div id="contacts"></div>

四、使用JQuery创建类似String.Format的功能

String.Format = function () {
    if (arguments.length == 0)
        return null;
    var str = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        var re = new RegExp(‘\\{‘ + (i - 1) + ‘\\}‘, ‘gm‘);
        str = str.replace(re, arguments[i]);
    }
    return str;
}
时间: 2024-10-14 19:52:33

JQuery + ASP.Net Web API一个简单应用的相关文章

通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用

REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站,企业级Web应用对用户体验的要求要低一些.不过客户对“用户体验”的要求是“与日俱增”的,很多被“惯坏了”的用户已经不能忍受Postback带来的页面刷新,所以Ajax在企业级Web应用中得到了广泛的应用.企业级Web应用的一个特点是以“数据处理”为主,所以“面向绑定”的Knockout.js 是一

水煮 ASP.NET Web API(1-3)如何接收 HTML 表单请求

问题 我们想创建一个能够处理 HTML 表单的 ASP.NET Web API 应用程序(使用 application/x-www-form-urlencoded 方式提交数据). 解决方案 我们可以创建一个 Controller Action 接收一个 Moddel,Model 的结构和准备从HTML 表单提交的准备处理的结构相似,模型绑定依赖于 ASP.NET Web API 来处理.模型中的属性名字和 HTTP 请求中要用的名字要匹配. public HttpResponseMessage

【ASP.NET Web API教程】1.1 第一个ASP.NET Web API

参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-put.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-delete.html http://www.yuanjiaocheng.net/webapi/httpclient-consume-webapi.html http://www.yuanjiaocheng.net/webapi/webapi-di-

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,正常情况下Web Api是不允许这样做的,这涉及到安全问题.所以,今天我们这篇文章的主

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)

chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angularjs文章:http://chsakell.com/2015/08/23/building-single-page-applications-using-web-api-and-angularjs-free-e-book/ 这里记录下对此项目的理解.分为如下几篇: ● 对一个前端使用AngularJ

对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angularjs文章:http://chsakell.com/2015/08/23/building-single-page-applications-using-web-api-and-angularjs-free-e-book/ 这里记录下对此项目的理解.分为如下几篇: ● 对一个前端使用AngularJ

六种简单方法提升ASP.NET Web API性能

ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术.  1) 使用最快的 JSON 序列化工具 JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响. 在我的一个项目里,我从 JSON.NET 序列化工具转到了 ServiceStack.Text 有一年半了. 我测量过,Web API 的性能提升了2

ASP.NET Web API 记录请求响应数据到日志的一个方法

原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个方法 REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉.后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看. 今天这篇文章是使用ASP.NET W