非侵入式Ajax
基本准备
首先,新建一个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的更多相关文章
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
开发者博客: BlockCanary — 轻松找出Android App界面卡顿元凶 开源代码:moduth/blockcanary BlockCanary对主线程操作进行了完全透明的监控,并能输出有 ...
- 使用phpAnalysis打造PHP应用非侵入式性能分析器
使用phpAnalysis打造PHP应用非侵入式性能分析器,查找PHP性能瓶颈. 什么是phpAnalysis phpAnalysis是一款轻量级非侵入式PHP应用性能分析器,适用于开发.测试及生产环 ...
- Spring学习(1):侵入式与非侵入式,轻量级与重量级
一. 引言 在阅读spring相关资料,都会提到Spring是非侵入式编程模型,轻量级框架,那么就有必要了解下这些概念. 二. 侵入式与非侵入式 非侵入式:使用一个新的技术不会或者基本不改变原有代码结 ...
- 非侵入式JavaScript(Unobtrusive javaScript)理解
转载自 https://my.oschina.net/leegq/blog/279750 在Web的早期阶段,也就是在jQuery出现以前,在同一个文件中混杂JavaScript代码和HTML标记是非 ...
- Spring 侵入式和非侵入式
1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口. 2.如何实现非侵入式 ...
- Spring框架是一种非侵入式的轻量级框架
摘自<Spring框架技术> Spring框架是一种非侵入式的轻量级框架 1.非侵入式的技术体现 允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必 ...
- 支付宝开源非侵入式 Android 自动化测试工具 Soloπ
Soloπ(SoloPi)是支付宝开源的一个无线化.非侵入式的Android自动化测试工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 本文是SoloPi团队关 ...
- 侵入式&非侵入式
侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring ...
随机推荐
- Word如何设置单元格垂直居中
那两个上面是水平居中,下面是垂直居中.
- Tomcat部署时war和war exploded的区别
转自徐刘根的Tomcat部署时war和war exploded区别以及平时踩得坑 一.war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: ...
- mq使用经验
1.Producer使用指南--发送消息注意事项 1.正常情况下一个业务系统尽可能用一个Topic,消息子类型用tags来标识,tags可以由业务系统自由设置.只有发送消息设置了tags,消费方在订阅 ...
- 【mybatis】mybatis中insert 主键自增和不自增的插入情况【mysql】
主键不自增:返回值是插入的条数 <insert id="add" parameterType="EStudent"> insert into TSt ...
- Kubernetes环境下如何运行Coherence缓存集群
Oracle官方出了一个如何在Docker环境下运行Coherence的技术文档,大家可以参考: https://github.com/oracle/docker-images/tree/master ...
- 利用“进程注入”实现无文件复活 WebShell
引子 上周末,一个好兄弟找我说一个很重要的目标shell丢了,这个shell之前是通过一个S2代码执行的漏洞拿到的,现在漏洞还在,不过web目录全部不可写,问我有没有办法搞个webshell继续做内网 ...
- mipmap of unity
遇到个奇怪的事情 mipmap generation 0级不压缩 1级 4个合1个 在unity里面 明显开了 mipmapgenerate之后 level0变糊了 ================ ...
- ubuntu14.04 server 安装docker
安装docker服务 $ curl -sSL https://get.docker.com/ | sh $ ocker run hello-world 测试docker是否安装成功 ubuntu ...
- Macro definition of snprintf conflicts with Standard Library function declaration
Macro definition of snprintf conflicts with Standard Library function declaration 即将此处的宏定义注释掉,因为在VS2 ...
- sencha touch结合webservice读取jsonp数据详解
sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...