基本准备  

  首先,新建一个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. postprocessing stack v2

    用了v2和unity2017.3.0f有兼容性问题 在assetbundle的情况下 CopyStd这个shader打不进去 在assetbundle的menafest里面有列但是shader.fin ...

  2. 46. Permutations 排列数

    46. Permutations 题目 Given a collection of distinct numbers, return all possible permutations. For ex ...

  3. 2017.10.25 es-sql分页无效

    1.问题描述 使用es-sql聚合查询时,发现无法进行分页操作. 结果为16条: 当使用limit语法进行分页之后,发现并没有效果(以取5条记录为一页为例). 首先查询前5条记录: 返回的记录如下图: ...

  4. Robomongo与MongoDB的故事

    Robomongo,Mongo可视化工具 哇唔,事实上她是三(阴险脸). 你看你看,界面清新,让人家心旷神怡(害羞).谁还想win+R+mongo呀呀呀?! 哎呀呀,继续···说正事. 在这里···借 ...

  5. Java Executor框架

    java.util.concurrent 包中包含灵活的线程池实现,但是更重要的是,它包含用于管理实现 Runnable 的任务的执行的整个框架,该框架称为 Executor 框架.该框架基于生产者- ...

  6. diskpart分盘代码

    List Disk Select Disk 0 Clean Create Partition Primary Size=512000 Active Format Quick Create Partit ...

  7. HDU1157 Who&#39;s in the Middle

    Who's in the Middle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. ios 第三方qq登陆,号码禁止授权

    在以下加入測试账号就可以 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpbmNleGlhb2hhbw==/font/5a6L5L2T/fontsiz ...

  9. Windows外壳名字空间的浏览

    Windows95/98对Dos/Win3.x作了许多重大改进,在文件系统方面,它除了采用长文件名替代Dos中的8.3文件名以外,引入外壳名字空间(Shell Name Space)来代Dos文件系统 ...

  10. 网页中多一些常见效果之伸缩菜单(主要是学习js的书写方法)

    效果如下图: 代码很简单,如下: <!doctype html> <html lang="en"> <head> <meta charse ...