目前为止,我们已经考察了如何编写客户端JavaScript代码,以发送并接受服务器的数据。然而,在使用ASP.NET MVC时,还有另一种方法可用来执行Ajax调用,这就是Ajax辅助方法。

Ajax是Asynchronous JavaScript and XML的缩写,是目前非常热门的网页开发技术之一,利用Ajax开发技术可以帮助网站减少切换页面的机会、加快网页响应速度、降低网络下载流量,也能让用户经验变得更好。ASP.NET MVC内建了Ajax辅助方法,可以帮助开发人员快速且方便地做到许多Ajax互动效果。

这些可用的辅助方法是AjaxHelper类的扩展方法,可以用来生成自动用Ajax发送并接受数据的标记,如下表所示。

辅助方法 描述
Ajax.ActionLink 创建一个发送到控制器动作的超链接,点击时触发Ajax请求。
Ajax.RouteLink 类似于Ajax.ActionLink,但生成的是一个发送到特定路由而不是控制器动作的链接。
Ajax.BeginForm 创建一个表单,它使用Ajax将其数据提交给一个特定的控制器动作。
Ajax.BeginRouteForm 类似于Ajax.eginForm,但创建的是一个将其数据提交给特定路由而不是控制器动作的表单。
Ajax.GlobalizationScript 创建一个HTML的script元素,它引用一个含有文化信息的脚本。
Ajax.JavaScriptStringEncode 对字符串进行编码,以确保在JavaScript中能安全使用。

1.使用Ajax的前提  

在开始使用Ajax辅助方法之前,必须要先在页面中载入jQuery以及ASP.NET MVC4项目模板内附的jquery.unobtrusive-ajax.js文件才能正常执行。

为了让网站载入适当的JavaScript函数库,必须先在Layout页面载入适当的JavaScript文件才行。事实上,在ASP.NET MVC4的Internet模板中已经在_Layout.cshtml页面中加上了jQuery载入,可以开启母版页面的最下方看到以下这段:

        @Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>

因为Ajax功能并不是每一页都需要使用,所以预设并没有载入,可以通过layout模板中的@RenderSection区域来载入jquery.unobtrusive-ajax.js文件。如果需要在页面中使用ASP.NET MVC的Ajax辅助方法,那么可以在每个需要使用Ajax辅助方法的页面最上方加上以下这段@section语法:

@section Scripts {
@Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.js")
}

2.使用Ajax超链接功能Ajax.ActionLink()

在客户端创建一个超链接,当单击这个超链接时可以异步调用控制器中的方法。

public static string ActionLink(tis AjaxHelper ajaxelper, string linkText, string actionName, 
object routeValues, AjaxOptions ajaxOptions);

使用Ajax辅助方法和使用HTML辅助方法非常类似,但Ajax辅助方法会比HTML辅助方法多出一个AjaxOptions类型参数,用来控制Ajax执行时的各种参数。可用的AjaxOptions选项如下表所示。

选项 描述
Confirm 等效于JavaScript中的return confirm(msg),在单击该链接时先提示需要确认的信息
HttpMethod 指定使用Get或Post方式发送Http请求
InsertionMode 指定使用哪一种方式在指定的UpdateTargetId元素更新数据,可以有三种方式InsertAfter、InsertBefore、Replace。默认为Replace。
LoadingElementDuration Loading元素显示的时间
LoadingElementId 可以指定在Http请求期间显示的Loading元素
OnBegin 在Http请求之前执行的javaScript方法
OnComplete 在Http请求结束时执行的方法
OnFailure 在Http请求失败时执行的方法
OnSuccess 在Http请求成功时执行的方法
UpdateTargetId Http请求更新的页面元素
Url Http请求的Url

(1)大作业中的管理员审核留言页面

<h2>未通过审核的留言管理</h2>

@{
var ajaxOptions1 = new AjaxOptions()
{
OnSuccess = "SetPassSuccess",
OnFailure = "SetPassFailure",
Confirm = "设置留言审核状态为'通过'?",
HttpMethod = "Post"
}; var ajaxOptions2 = new AjaxOptions()
{
OnSuccess = "DeleteSuccess",
OnFailure = "DeleteFailure",
Confirm = "确认要删除留言?",
HttpMethod = "Post"
};
} @section scripts
{
@Scripts.Render("~/bundles/jqueryval")
<script>
function SetPassSuccess() {
alert('审核通过');
location.reload();
}
function SetPassFailure(xhr) {
alert('审核失败(HTTP状态代码:' + xhr.status + ')');
}
function DeleteSuccess() {
alert('成功删除建议');
location.reload();
}
function DeleteFailure(xhr) {
alert('删除留言失败(HTTP状态代码:' + xhr.status + ')');
}
</script>
} @foreach (var item in Model)
{
<div class="box" style="border-bottom: 1px solid black;">
<br />
<b>@Html.DisplayNameFor(model => model.Name):</b>
@Html.DisplayFor(modelItem => item.Name)&nbsp;&nbsp;&nbsp;&nbsp;
<b>@Html.DisplayNameFor(model => model.PostTime):</b>
@Html.DisplayFor(modelItem => item.PostTime)<br />
<b>@Html.DisplayNameFor(model => model.Content):</b>
@Html.DisplayFor(modelItem => item.Content)<br />
<br /> @Ajax.ActionLink("通过审核", "ConfirmPass", new { id = item.Id }, ajaxOptions1) |
@Ajax.ActionLink("删除留言", "Delete", new { id = item.Id }, ajaxOptions2) <br />
<br />
</div>
}

(2)使用Ajax获取当前时间

public ActionResult GetTime()
{
return Content(DateTime.Now.ToString("F"));
}
@Ajax.ActionLink("取得目前时间","GetTime",new AjaxOptions{UpdateTargetId="now"})

<div id="now"></div>

这里有一点必须特别说明一下,就是通过Ajax远端取得网页内容的过程。浏览器为了让执行效率提升,会预设通过Ajax取得的网页内容只要Ajax调用网址没有改变,且远端的HTTP没有包含缓存相关标头(Headers),那么浏览器就不会再次发出Ajax请求。以上述Ajax.ActionLink辅助方法输出的结果为例,当第一次点击取得/Home/GetTime时会回传当下的服务器时间,当第二次点击同一个网址,按理说应该看到内容更新才对,但结果却永远无法更新,除非你清空浏览器缓存。 如果你的Ajax回传的数据必须即时更新,那么,就必须调整你的Action方法定义,新增一个OutputCache属性(Attribute),强迫浏览器不要缓存这一页的请求,范例如下:

        [OutputCache(NoStore=true,Duration=0)]
public ActionResult GetTime()
{
return Content(DateTime.Now.ToString("F"));
}

2.使用Ajax表单功能

@using(Ajax.BeginForm(new AjaxOptions{UpdateTargetId="now"}))

用户送出表单,对<form>表单元素上的action属性的Acion网址发出Http要求,并将表单所有数据传过去。取回内容后再将内容填入AjaxOptions的UpdateTargetId属性所指定的id元素中。

Ajax辅助方法的更多相关文章

  1. [MVC]Ajax辅助方法

    在开始使用Ajax辅助方法前,必须在页面中载入jQuery以及jquery.unobtrusive-ajax.js文件才能正常执行. 为了让网站载入适当的JS函数库,必须先让Layout页面载入适当的 ...

  2. 表单和 HTML 辅助方法– ASP.NET MVC 4 系列

           这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...

  3. Ajax.ActionLink()方法的使用

    第一句话都会这么去写:程序猿就是苦逼,除了开发还要会写博文!哎,今天就和大家一起讨论下Ajax的辅助方法ActionLink的使用,如果有讲的不好的地方或错的地方,请大家务必扔板砖,要投准哦,砸死我算 ...

  4. 34-Ajax辅助方法

    Ajax是Asynchronous JavaScript and XML的缩写,是目前非常热门的网页开发技术之一,利用Ajax开发技术可以帮助网站减少切换页面的机会.加快网页响应速度.降低网络下载流量 ...

  5. ASP.NET MVC 3 之表单和 HTML 辅助方法(摘抄)

    ——选自<ASP.NET MVC3 高级编程(第5章) 孙远帅 译> 第5章 表单和HTML辅助方法 本章内容简介: * 理解表单 * 如何利用HTML辅助方法 * 编辑和输入的辅助方法 ...

  6. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  7. ASP.NET MVC3学习心得-----表单和HTML辅助方法

    5.1表单的使用 5.1.1  action和method的特性 表单是包含输入元素的容器,包含按钮.复选框.文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器.A ...

  8. ASP.NET MVC5高级编程 之 HTML辅助方法

    Html属性调用HTML辅助方法,Url属性调用URL辅助方法,Ajax属性调用Ajax辅助方法. HTML辅助方法 1.Html.BeginForm @using (Html.BeginForm(& ...

  9. ASP.NET MVC5 学习系列之表单和HTML辅助方法

    一.表单 (一)Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址.这里的Url地址可以是相对的,也可以是绝对的.如下Form ...

随机推荐

  1. [转]如何理解c和c ++的复杂类型声明

    本文作者girlrong是网易广州社区的C语言版版主,这篇文章被选在精华区.很是不错,不敢独享!据说她乐于助人,虚心诚恳,颇受网友欢迎.只可惜现在已退隐江湖了.在最近学习C语言过程中,了解些前辈大牛的 ...

  2. IO调度算法研究1

    linux kernel 2.6之后提供了四种IO调度算法,每种调度算法都有其不同的特点和应用场景,系统使用者可以通过系统提供的接口,选择使用哪种IO调度算法,以及调整IO调度算法的参数,以达到最优的 ...

  3. JQuery 限制文本框只能输入数字和小数点

    $(function(){ /*JQuery 限制文本框只能输入数字*/ $(".NumText").keyup(function(){ $(this).val($(this).v ...

  4. 转 释一首美国民谣:沉默之音(The Sound Of Silence)

    Ask not what your country can do for you , ask what you can do for your country.    六十年代对美国而言是个多事之秋的 ...

  5. 想精度高,可以考虑用c语言中的函数gettimeofday

    大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime ...

  6. BZOJ 1192 鬼谷子的钱袋 (二进制思想)

    题解:鉴于二进制的思想来划分 #include <cstdio> int main(){ int n,d=0;scanf("%d",&n); while(1&l ...

  7. [编程语言][java][java se]java泛型中? T K V E含义(学习)

    ? 表示不确定的java类型,类型是未知的. T  表示java类型. K V 分别代表java键值中的Key Value. E 代表Element,特性是枚举. 1.意思     jdk中的K,V, ...

  8. Python+Django+SAE系列教程9-----Django的视图和URL

    第三.四.五章介绍的就是Django中MVC的视图.模板.模型了. 首先来看视图(view),在用Django生成的站点目录中,创建一个view.py文件,这个文件開始是空的.然后我们输入下面内容: ...

  9. 面试之get和post(转)

    总结1 表单提交中get和post方式的区别归纳如下几点: GET是从服务器上获取数据,POST是向服务器传送数据,GET 请求一般不应产生副作用.就是说,它仅仅是获取资源信息,就像数据库查询一样,不 ...

  10. 基于表单的身份验证(FBA)

    https://technet.microsoft.com/zh-cn/library/ee806890(office.15).aspx http://www.tuicool.com/articles ...