《ASP.NET MVC 4 实战》学习笔记 8:Ajax(下)

三、使用JSON和客户端模板的Ajax:

1.使用JSON的Ajax:
1)添加模型:

{
    public class Speaker
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string PictureUrl { get; set; }
        public string Bio { get; set; }

        public string FullName
        {
            get { return string.Format("{0} {1}", FirstName, LastName); }
        }
    }
}

2)添加模拟数据和方法:

namespace AjaxExamples.Models
{
    public class SpeakerRepository
    {
        //simulate an in memory database
        private static readonly List<Speaker> _speakers = new List<Speaker>();

        static SpeakerRepository()
        {
            _speakers = new List<Speaker> {

               new Speaker
                {
                    Id = 1,
                    FirstName = "Jimmy",
                    LastName = "Bogard",
                    PictureUrl = "/content/jimmy.png",
                    Bio = "Jimmy is a Principal Consultant at Headspring Systems in Austin, TX.",
                },
                new Speaker
                {
                    Id = 2,
                    FirstName = "Jeffrey",
                    LastName = "Palermo",
                    PictureUrl = "/content/jeffrey.jpg",
                    Bio = "Jeffrey Palermo is a Microsoft MVP and Chief Technology Officer of Headspring Systems in Austin, TX.",
                },
                new Speaker
                {
                    Id = 3,
                    FirstName = "Eric",
                    LastName = "Hexter",
                    PictureUrl = "/content/eric.jpg",
                    Bio = "Eric Hexter is an Enterprise Architect at Dell in Austin, TX.",
                },
                new Speaker
                {
                   Id = 4,
                   FirstName = "Matt",
                   LastName = "Hinze",
                   PictureUrl = "/content/matt.jpg",
                   Bio = "Matt Hinze is a Principal Consultant at Headspring Systems in Austin, TX.",
                },

               new Speaker
                {
                    Id = 5,
                    FirstName = "Jeremy",
                    LastName = "Skinner",
                    PictureUrl = "/content/jeremy.jpg",
                    Bio = "Jeremy Skinner is a C#/ASP.NET software developer in the UK.",
                }
            };

        }

        public IEnumerable<Speaker> FindAll()
        {
            return _speakers;
        }

        public Speaker FindSpeaker(int id)
        {
            return _speakers.SingleOrDefault(x => x.Id == id);
        }
    }
}

3)添加控制器:

namespace AjaxExamples.Controllers
{
    public class SpeakersController : Controller
    {
        private readonly SpeakerRepository _repository = new SpeakerRepository();
        public ActionResult Index()
        {
            var speakers = _repository.FindAll();
            return View(speakers);
        }
        public ActionResult Details(int id)
        {
            var speaker = _repository.FindSpeaker(id);
            return Json(speaker, JsonRequestBehavior.AllowGet);//将发言人序列成json
        }
    }
}

4)添加视图:

@model IEnumerable<AjaxExamples.Models.Speaker>

<link href="@Url.Content("~/Content/speakers.css")" rel="stylesheet" />
<script src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/Speakers.js")"></script>

<ul class="speakers">
    @foreach (var speaker in Model)
    {
        <li>
            @Html.ActionLink(speaker.FullName, "Details", new { id = speaker.Id })
        </li>
    }
</ul>

<img id="indicator" src="~/Content/load.gif" alt="loading..." style="display:none;" />@*显示进度指示器*@

5)添加Speakers.js文件:

$(document).ready(function () {
    $("ul.speakers a").click(function (e) {
        e.preventDefault();
        $("#indicator").show();//显示进程指示器
        var url = $(this).attr(‘href‘);//接受URL
        $.getJSON(url, null, function (speaker) {//调用Ajax请求
            $("#indicator").hide();
            alert(speaker.FirstName);
        });
    });
}); 

上面的例子只是弹出发言人名字的模态对话框,下面我们将使用客户端模板显示更详细的信息。

2.客户端模板:
客户端模板能够在浏览器中动态地生成标记,而不必返回服务器。

1)下载jQuery-tmpl并引入项目:

2)修改视图:

@model IEnumerable<AjaxExamples.Models.Speaker>

<link href="@Url.Content("~/Content/speakers.css")" rel="stylesheet" />
<script src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.tmpl.js")"></script>
<script src="@Url.Content("~/Scripts/Speakers.js")"></script>

<ul class="speakers">
    @foreach (var speaker in Model)
    {
        <li>
            @Html.ActionLink(speaker.FullName, "Details", new { id = speaker.Id })
        </li>
    }
</ul>

<img id="indicator" src="~/Content/load.gif" alt="loading..." style="display:none;" />@*显示进度指示器*@

<div class="selected-speaker" style="display:none">
</div>

<br style="clear:both" />

<script id="speakerTemplate" type="text/x-jquery-tmpl">@*定义模板*@
    <img src="${PictureUrl}" alt="Speaker image" class="speaker-pic" />@*照片模板*@
    <p class="speaker-bio">${Bio}</p>@*简历行模板*@

    <br style="clear:both;" />
</script>

3)修改Speakers.js:

$(document).ready(function () {
    $("ul.speakers a").click(function (e) {
        e.preventDefault();

        $(".selected-speaker").hide().html(‘‘);//隐藏发言人细节模板
        $("#indicator").show();

        var url = $(this).attr(‘href‘);

        $.getJSON(url, null, function (speaker) {
            $("#indicator").hide();

            $("#speakerTemplate")
                .tmpl(speaker)
                .appendTo(‘.selected-speaker‘);//渲染带有数据的模板

            $(‘.selected-speaker‘).show();
        });
    });
});

但是不幸的是会报错,没有找到原因,有没有人告诉我为什么。。。

3.最后润色:

如果浏览器禁用了javascript那么当点击发言人姓名时相应的JSON将作为文本文件下载而不会作为模板来渲染。

依然可以重写Details方法和添加Details视图解决:

public ActionResult Details(int id)
        {
            var speaker = _repository.FindSpeaker(id);
            if (Request.IsAjaxRequest())
            {
                return Json(speaker, JsonRequestBehavior.AllowGet);//将发言人序列成json
            }
            return View(speaker);

        }
@model AjaxExamples.Models.Speaker
@{
    ViewBag.Title = "Details";
}

<h2>发言人详细信息: @Model.FullName</h2>

<p class="speaker">
    <img src="@Model.PictureUrl" alt="@Model.FullName" />
<p class="speaker-bio">@Model.Bio</p>
</p>

<br style="clear:both" />
@Html.ActionLink("返回列表", "index")

但是也可以采用另一种方式--使用“动作方法选择器”来区分Ajax和非Ajax请求:

1)添加继承自ActionMethodSelectorAttribute的类:

namespace AjaxExamples
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AcceptAjaxAttribute : ActionMethodSelectorAttribute
    {
        public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
        {
            return controllerContext.HttpContext.Request.IsAjaxRequest();
        }
    }
}

如果当前动作是通过Ajax请求的AcceptAjaxAttribute便在IsValidForRequest方法中返回true。

2)将Details拆分成两个方法:

     [AcceptAjax]
        public ActionResult Details(int id)
        {
            var speaker = _repository.FindSpeaker(id);
            return Json(speaker, JsonRequestBehavior.AllowGet);
        }

        [ActionName("Details")]
        public ActionResult Details_NonAjax(int id)
        {
            var speaker = _repository.FindSpeaker(id);
            return View(speaker);
        }

上面方法第一个重载以AcceptAjaxAttribute注解用于处理Ajax请求,另一个用于常规请求。

四、创建自动完成文本框(jQuery UI):

1)下载并引入jQuery UI

2)添加City模型:

namespace AjaxExamples.Models
{
    public class City
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string State { get; set; }

        public string DisplayName
        {
            get { return Name + ", " + State; }
        }
    }
}

3)添加模拟数据和方法:

namespace AjaxExamples.Controllers
{
    public class CityRepository
    {
        const string _csvFilename = "App_Data/cities.csv";
        static readonly List<City> _cities;

        static CityRepository()
        {
            string path = Path.Combine(HttpRuntime.AppDomainAppPath, _csvFilename);

            _cities = new List<City>();

            int id = 1;
            foreach (var line in File.ReadAllLines(path))
            {
                var lineSegments = line.Split(‘,‘);
                var name = lineSegments[0];
                var state = lineSegments[1];

                var city = new City { Id = id++, Name = name, State = state };
                _cities.Add(city);
            }
        }

        public City[] FindCities(string filter)
        {
            var cities = from city in _cities
                         where city.DisplayName.StartsWith(filter, StringComparison.CurrentCultureIgnoreCase)
                         select city;

            return cities.ToArray();
        }
    }
}

4)添加控制器:

namespace AjaxExamples.Controllers
{
    public class CitiesController : Controller
    {
        private readonly CityRepository _repository;

        public CitiesController()
        {
            _repository = new CityRepository();
        }

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Find(string term)
        {
            City[] cities = _repository.FindCities(term);

            var projection = from city in cities
                             select new
                             {
                                 id = city.Id,
                                 label = city.DisplayName,
                                 value = city.DisplayName
                             };

            return Json(projection.ToList(), JsonRequestBehavior.AllowGet);
        }
    }
}

5)添加视图:

<link href="@Url.Content("~/Content/jquery-ui.css")" rel="stylesheet" />

<p>
    <label for="city">城市</label>
    <input type="text" id="city" />
</p>

<script src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery-ui.js")"></script>

<script type="text/javascript">
    $(function () {
        var autocompleteUrl = ‘@Url.Action("Find")‘;
        $("input#city").autocomplete({
            source: autocompleteUrl,
            minLength: 2,
            select: function (event, ui) {
                alert("选中 " + ui.item.label);
            }
        });
    });
</script>

但是不幸的是还是会报错,原因应该和上面一样,有没有人告诉我为什么。。。

源码下载 密码:53my

时间: 2024-10-14 12:37:48

《ASP.NET MVC 4 实战》学习笔记 8:Ajax(下)的相关文章

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: <input name="UserName&quo

ASP.Net MVC开发基础学习笔记:一、走向MVC模式

一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由

ASP.Net MVC开发基础学习笔记(1):走向MVC模式

链接地址:http://blog.jobbole.com/84992/ 一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到

ASP.NET MVC Web API 学习笔记---Web API概述及程序示例

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP) 2. ASP.NET W

ASP.NET MVC Web API 学习笔记---第一个Web API程序

http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有

ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器

一.校验 — 表单不是你想提想提就能提 1.1 DataAnnotations(数据注解) 位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证.这些特性用于定义常见的验证模式,例如范围检查和必填字段.而 DataAnnotations 特性使 MVC 能够提供客户端和服务器验证检查,使你无需进行额外的编码来控制数据的有效. 通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证

ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新的区域,可以让我们的项目不至于太复杂而导致管理混乱.有了区域后,每个模块的页面都放入相应的区域内进行管理很方便.例如:上图中有两个模块,一个是Admin模块,另一个是Product模块,所有关于这两个模块的控制器.Model以及视图都放入各自的模块内.可以从上图中看出,区域的功能类似一个小的MVC项

【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有一定的区别:Web API服务是通过一般的 HTTP公开了,而不是通过更正式的服务合同 (如SOAP)  2. ASP.NET