基本准备  

  首先,新建一个ASP.NET MVC 3的空项目。

  然后新增一个Model,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web; namespace MVCApplication.Models
{
public class Appointment
{
public string ClientName { get; set; } [DataType(DataType.Date)]
public DateTime Date { get; set; } public bool TermAccepted { get; set; }
}
}

  接着是新增一个Controller,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCApplication.Models; namespace MVCApplication.Controllers
{
public class AppointmentController : Controller
{
//
// GET: /Appointment/ public ActionResult Index()
{
return View();
} [HttpPost]
public ActionResult Index(string id)
{
return View("Index", (object)id);
} public ViewResult AppointmentData(string id)
{
IEnumerable<Appointment> data = new[] {
new Appointment{ClientName="Joe", Date = DateTime.Parse("1/1/2012")},
new Appointment{ClientName="Joe", Date = DateTime.Parse("2/1/2012")},
new Appointment{ClientName="Joe", Date = DateTime.Parse("3/1/2012")},
new Appointment{ClientName="Jane", Date = DateTime.Parse("1/20/2012")},
new Appointment{ClientName="Jane", Date = DateTime.Parse("1/22/2012")},
new Appointment{ClientName="Bob", Date = DateTime.Parse("2/25/2012")},
new Appointment{ClientName="Bob", Date = DateTime.Parse("2/25/2013")}
}; if(!string.IsNullOrEmpty(id) && id != "All")
{
data = data.Where(e => e.ClientName == id);
} return View(data);
}
}
}

  最后是新增两个View,分别如下。

  Index.cshtml:

@model string
@{
ViewBag.Title = "Index";
} <h4>Appointment List</h4> @using (Html.BeginForm())
{
<table>
<thead>
<th>Client Name</th>
<th>Appointment Date</th>
</thead>
<tbody id="tabledata">
@Html.Action("AppointmentData", new { id = Model})
</tbody>
</table>
<p>
@Html.DropDownList("id", new SelectList(new[] {"All", "Joe", "Jane", "Bob"}, (Model ?? "All")))
<input type="submit" value="Sumbit" />
</p>
}

  AppointmentData.cshtml:

@using MVCApplication.Models
@model IEnumerable<MVCApplication.Models.Appointment>
@{
Layout = null;
}
@foreach (Appointment appt in Model)
{
<tr>
<td>@Html.DisplayFor(m => appt.ClientName)</td>
<td>@Html.DisplayFor(m => appt.Date)</td>
</tr>
}

  其中,AppointmentData.cshtml是作为一个partialview的。

  这样,当点击按钮时,页面回送给服务器,根据用户所选择的选项显示相应数据。

启用AJAX

  为了启用AJAX,需要在Web.config中新增一行配置,如下:

<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
...
</configuration>

  这里有两个配置,第一个是启用客户端验证的,它依赖于第二个配置。第二个配置就是启用AJAX的。

  页面上为了引用AJAX,需要引用一个AJAX文件,可以加在模板页中,如下:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-Ajax.js")" type="text/javascript"></script>

接下来还要做两个工作。

  第一,定义一个AjaxOptions,这个里面有很多配置,目前先只使用UpdateTargetId,它定义要替换的目标。

  第二,将Html.BeginForm()替换为Ajax.BeginForm("AppointmentData", ajaxOpts)。

  修改后的Index.cshtml如下:

@model string
@{
ViewBag.Title = "Index";
AjaxOptions ajaxOpts = new AjaxOptions
{
UpdateTargetId = "tabledata"
};
} <h4>Appointment List</h4> @using (Ajax.BeginForm("AppointmentData", ajaxOpts))
{
<table>
<thead>
<th>Client Name</th>
<th>Appointment Date</th>
</thead>
<tbody id="tabledata">
@Html.Action("AppointmentData", new { id = Model})
</tbody>
</table>
<p>
@Html.DropDownList("id", new SelectList(new[] {"All", "Joe", "Jane", "Bob"}, (Model ?? "All")))
<input type="submit" value="Sumbit" />
</p>
}

  OK,这样点击按钮时就会在后台发送一个Ajax请求。

实现剖析

   AjaxOptions类会被转换成Html元素,这是Ajax帮助类实现的。比如,我们上面的Ajax.BeginForm()会输出下面的HTML。

<form action="/Appointment/AppointmentData" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#tabledata" id="form0" method="post">

  jquery.unobtrusive-ajax.js会扫描HTML的DOM对象,通过data-ajax="true"识别ajax form。别的data-ajax开头的属性是我们在AjaxOptions中设置的相应属性。

  以上是使用了MVC框架的AJAX支持。你也可以选择不使用这种方式,比如完全使用JQUERY,或者使用别的框架,或者直接使用JS。但是不要在一个View中混合使用以上方式,以免发生冲突而得到意外的结果。

设置AJAX选项

  我们可以通过设置AjaxOptions的属性很好地调整我们的AJAX请求的行为。

优雅切换

  上面的例子中,我们做到了使用Ajax做请求,但这依赖于客户端启用JS。一旦客户端禁用JS,那一切将变得徒劳无功。

  最简单的解决办法是设置AjaxOptions中的Url属性,通过使用Url.Action(action method)方法,同时使用Ajax.BeginForm(AjaxOptions)方法。如果客户端启用JS支持,那么一切仍然是正常的,否则就会Index action会收到Post请求,然后整个页面都会刷新。

非侵入式Ajax的更多相关文章

  1. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  2. BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)

    开发者博客: BlockCanary — 轻松找出Android App界面卡顿元凶 开源代码:moduth/blockcanary BlockCanary对主线程操作进行了完全透明的监控,并能输出有 ...

  3. 使用phpAnalysis打造PHP应用非侵入式性能分析器

    使用phpAnalysis打造PHP应用非侵入式性能分析器,查找PHP性能瓶颈. 什么是phpAnalysis phpAnalysis是一款轻量级非侵入式PHP应用性能分析器,适用于开发.测试及生产环 ...

  4. Spring学习(1):侵入式与非侵入式,轻量级与重量级

    一. 引言 在阅读spring相关资料,都会提到Spring是非侵入式编程模型,轻量级框架,那么就有必要了解下这些概念. 二. 侵入式与非侵入式 非侵入式:使用一个新的技术不会或者基本不改变原有代码结 ...

  5. 非侵入式JavaScript(Unobtrusive javaScript)理解

    转载自 https://my.oschina.net/leegq/blog/279750 在Web的早期阶段,也就是在jQuery出现以前,在同一个文件中混杂JavaScript代码和HTML标记是非 ...

  6. Spring 侵入式和非侵入式

    1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口. 2.如何实现非侵入式 ...

  7. Spring框架是一种非侵入式的轻量级框架

    摘自<Spring框架技术> Spring框架是一种非侵入式的轻量级框架 1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必 ...

  8. 支付宝开源非侵入式 Android 自动化测试工具 Soloπ

    Soloπ(SoloPi)是支付宝开源的一个无线化.非侵入式的Android自动化测试工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 本文是SoloPi团队关 ...

  9. 侵入式&非侵入式

    侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring ...

随机推荐

  1. Word如何设置单元格垂直居中

    那两个上面是水平居中,下面是垂直居中.

  2. Tomcat部署时war和war exploded的区别

    转自徐刘根的Tomcat部署时war和war exploded区别以及平时踩得坑 一.war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: ...

  3. mq使用经验

    1.Producer使用指南--发送消息注意事项 1.正常情况下一个业务系统尽可能用一个Topic,消息子类型用tags来标识,tags可以由业务系统自由设置.只有发送消息设置了tags,消费方在订阅 ...

  4. 【mybatis】mybatis中insert 主键自增和不自增的插入情况【mysql】

    主键不自增:返回值是插入的条数 <insert id="add" parameterType="EStudent"> insert into TSt ...

  5. Kubernetes环境下如何运行Coherence缓存集群

    Oracle官方出了一个如何在Docker环境下运行Coherence的技术文档,大家可以参考: https://github.com/oracle/docker-images/tree/master ...

  6. 利用“进程注入”实现无文件复活 WebShell

    引子 上周末,一个好兄弟找我说一个很重要的目标shell丢了,这个shell之前是通过一个S2代码执行的漏洞拿到的,现在漏洞还在,不过web目录全部不可写,问我有没有办法搞个webshell继续做内网 ...

  7. mipmap of unity

    遇到个奇怪的事情 mipmap generation 0级不压缩 1级 4个合1个 在unity里面 明显开了 mipmapgenerate之后 level0变糊了 ================ ...

  8. ubuntu14.04 server 安装docker

    安装docker服务 $ curl -sSL https://get.docker.com/ | sh   $ ocker run hello-world 测试docker是否安装成功 ubuntu ...

  9. Macro definition of snprintf conflicts with Standard Library function declaration

    Macro definition of snprintf conflicts with Standard Library function declaration 即将此处的宏定义注释掉,因为在VS2 ...

  10. sencha touch结合webservice读取jsonp数据详解

    sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...