在ASP.NET MVC编程中使用AJAX功能是非常简单的。借助于JQuery框架,你还可以增加其他的优秀特征并且使AJAX调用特别简单。本文中,我们将探讨这方面的编程内容。

  一、检测一个AJAX请求

  在Web表单中,创建AJAX请求典型的方法是使用一个更新面板。当更新面板回寄时,ScriptManager提供一个方法(通过其isInAsyncPostBack属性)来检测服务器上的AJAX回寄。ASP.NET MVC也提供了类似的机制。因为AJAX能够调用行为方法,所以我们需要一种方法来检测一个请求是否是标准的GET/POST操作,还是一个AJAX请求。

  我们可以使用一个有用的扩展方法来实现上述检测,这只需调用Request.IsAjaxRequest()方法即可。我们知道,一个Web请求是一个针对HttpRequestBase(针对.NET框架HttpRequest对象的一个包装器)的引用,它也是一个控制器的属性。故而,我们可以使用IsAjaxRequest()方法来检查请求信息,以确保正在向服务器发出一个AJAX请求。通过这种方式,我们可以正确地检测出当前请求是一个ASP.NET请求还是一个jQuery请求。

  要实现上述这一点,只需要在你的行为方法中添加下面的代码。

  清单1—检测一个AJAX请求

if (Request.IsAjaxRequest())
//AJAX request
else
//Standard request

  为什么检测一个AJAX请求如此重要呢?因为根据行为方法所实现的任务我们处理AJAX请求的方式不同于标准的请求。我们很快会看到这样的例子。

  二、使用Ajax表单

  微软提供了一组AJAX扩展集,其中之一便是Ajax表单。通过此Ajax表单,可以向服务器发出异步请求并提供相关的响应内容。客户端所有的AJAX调用机制都包含在一个MicrosoftMVCAjax脚本内。清单2给出了一个简单的Ajax表单示例。

  清单2:使用AJAX.BeginForm扩展

<div id="customresponse"></div>
<% using (Ajax.BeginForm("AjaxCustom", new AjaxOptions
{ UpdateTargetId = "customresponse" })){%>
<div>
Name: <%= Html.TextBox("CustomName")%>
</div>
<div>
Value: <%= Html.TextBox("CustomValue")%>
</div>
<input type="submit" value="save" />
<%}%>

  上述AJAX表单处理回寄的细节,并使用JavaScript以异步方式执行,而不是执行一个到服务器端的标准HTTP回寄。在清单2中,表单把数据回寄到AjaxCustom行为方法,并把表单的值传递过去,最后得到返回的响应内容并以某种方式来使用这个结果。

  接下来,在行为方法中你可以使用非常现成的Request.IsAjaxRequest方法:

  清单3:处理可能的Ajax回寄并提供响应

[HttpPost]
public ActionResult AjaxCustom(FormCollection post)
{
if (Request.IsAjaxRequest())
return Content("Success");
else
return RedirectToAction("Index");
}

  如果是一个AJAX请求,则把一个特殊的字符串传递回客户端,并进行相应处理。这一行为是受AjaxOptions集合控制的。上面的清单2中把字符串“Success”注入到一个id为“customresponse”的HTML元素中。如果由于某种原因,该请求不是来自一个AJAX调用,行为方法仍可以正常工作—重定向到另一个视图中。我们将在以后的文章中讨论这些情况。

  上面我只是简要地介绍了使用MS Ajax的情况,因为我相信最好的AJAX方案是当属使用JQuery。

  三、使用JQuery

  jQuery功能非常强大,这种力量主要来自它的简单性以及它能够让你完全控制整个过程。JQuery能够通过简单的几行客户端代码就可以对一个MVC行为方法执行一个GET或POST操作。回调的结果直接传递给你手中,这意味着你可以全面控制响应操作,而且这一点是很容易做到的。在jQuery中,我们可以使用以下的形式把表单数据发布到服务器:

  清单4:回寄表单数据

var form = $("#form1");
$.post(form.attr("action"), form.serialize(), function(data){
//Do something with data
});

  一个行为方法的响应可以是以下类型之一:

  • Content("Success")—以一个字符串方式返回内容,然后你可以把它注入到HTML文档中。

      • Json(new{ a = 1 })—返回一个JSON对象。

      • View("Action")—以HTML字符串方式返回一个视图或部分视图。

  上述这些选项都非常棒,因为jQuery能够让你从根本上进行数据控制,你可以使用这些数据来注入到用户界面甚至完全取代UI内容。让我们分析针对上述选择的各个对应的例子。我构造了一个简单的控制器,它能够返回上述每一种类型的内容。

  清单5:返回上述每一种类型的内容示例

public class JQueryController : Controller
{
public ActionResult GettingContent()
{
return Content("This is my content");
}
public ActionResult GettingJson()
{
return Json(new { key = 1,value = "First" }, JsonRequestBehavior.AllowGet);
}
public ActionResult GettingPartial()
{
return PartialView("TestPartial");
}
public ActionResult Index()
{
return View();
}
}

  我们的客户端会使用jQuery来使用上面定义的这些行为方法,每一个对应使用一个单独的AJAX行为方法。在前面的JQuery调用中,执行了一个回寄,但我特意要求使用GET操作。一个GET和POST操作非常类似,除了POST传递的是一个序列值的集合之外。

  清单6:正在加载新数据

<script type="text/javascript">
$(document).ready(function(){
$.getJSON('<%= Url.Action("GettingJson")%>', function(obj){
$('#jsoninject').html(obj.key.toString()+" = "+ obj.value.toString());
});
$.get('<%= Url.Action("GettingContent")%>', function(obj){
$('#contentinject').html(obj);
});
$('#partialinject').load('<%= Url.Action("GettingPartial")%>');
});
</script>

  这些方法中,get和load工作非常相似,它们都把内容直接加载到HTML元素中。其中,load方法能够直接注入而不用回调,但get能够使你更多地控制数据的处理。

  在文档完全加载后,上述代码将产生以下HTML输出内容。

<H1>Injecting JSON Object</H1>
<DIV id=jsoninject>1 = First</DIV>
<H1>Injecting Content</H1>
<DIV id=contentinject>This is my content</DIV>
<H1>Injecting Partial</H1>
<DIV id=partialinject>
<DIV>This is my partial view. </DIV></DIV>

  四、使用属性控制请求

  当向服务器发出请求时,一切有关请求的内容都被检查(头部、正文,等等)。这是由AJAX请求决定的。根据你的应用程序的复杂程度,你可能想建立单独的行为方法,一个针对处理AJAX请求,另一个针对其余的请求。因此,一个索引视图可能会对应一个AjaxIndex行为方法来处理Ajax请求,而另外存在一个Index行为方法来处理其余的请求。为此,我们可以利用过滤器属性来确保调用正确的行为方法。

  下面给出的两个类都使用了一个过滤器属性,分别允许AJAX请求和标准的HTTP GET/POST请求。

  清单7:使用AJAX/标准请求过滤属性

public class AjaxOnlyRequestAttribute : ActionMethodSelectorAttribute
{
#region " Methods "
public override bool IsValidForRequest(ControllerContext
controllerContext, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request.IsAjaxRequest();
}
#endregion
}
public class StandardOnlyRequestAttribute : ActionMethodSelectorAttribute
{
#region " Methods "
public override bool IsValidForRequest(ControllerContext
controllerContext, MethodInfo methodInfo)
{
return !controllerContext.HttpContext.Request.IsAjaxRequest();
}
#endregion
}

  上面这些过滤器属性属于行为方法选择器类型。这意味着,当MVC框架试图匹配一个到行为方法的请求时,它将执行如下过程:

  1.尝试查找一个名字为Index的行为方法。

  2.是否查找完所有现有的规则?—是。

  3.检查过滤器—只存在一个Ajax过滤器。

  4.这是一个AJAX请求吗?—不是。

  5.忽略此行为方法。

  如果在该过程结束时,不存在任何行为方法,则将从服务器端返回资源没有发现的响应。

  五、小结

  在本文中,我们已经看到了MS AJAX和jQuery框架多种使用方法,而且了解到在MVC应用程序中使用AJAX支持是非常方便的。虽然这些功能也存在于Web表单框架下,但jQuery框架使你的MVC程序中实现AJAX调用更为容易。此外,自定义过滤器属性可以帮助你确定每一个请求相应的行为方法,或者可以使用Request.IsAjaxRequest方法直接检测请求类型。

【相关文章】:

巨大转变!ASP.NET MVC2行为方法新改进

巨大转变!教你使用ASP.NET MVC2新功能

巨大转变!ASP.NET MVC2用户界面新实践

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162693.html

一起谈.NET技术,巨大转变!ASP.NET MVC2调用AJAX新特征相关推荐

  1. 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...

  2. C#结合js 上传文件和删除文件(技术点有:asp.net mvc ,nhibernate,ajax等)

    之前做项目的时候要用到上传文件的功能,现在我总结一下,上传文件和删除文件的代码,在以后的使用的过程中也更方便查找. [HttpPost]public ActionResult EditUser(){v ...

  3. 一起谈.NET技术,专访微软MVP衣明志:走进ASP.NET MVC 2框架开发

    日前微软已经发布ASP.NET MVC 2框架RC版,究竟这次RC版本的发布对于WEB开发者带来怎样的改变?以及未来ASP.NET MVC 2正式版还会有哪些改进?带着这样的问题,我们51CTO记者彭 ...

  4. 浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...

  5. 一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页

    概述 很多地方都存在以Tab页来呈现数据的方式,比如网易.新浪.搜狐.QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据.大家之所以喜欢用Tab,因为它能大大的增加显示数 ...

  6. Asp.net中的AJAX学习记录之一 AJAX技术的崛起与Asp.net AJAX的诞生

      最近开始学习Asp.net中的AJAX,可能我的高手朋友们会说:"走还不稳呢!怎么就想学跑了?"呵呵!主要是我在做项目中体会到AJAX真的是很好的一门技术,应该好好的学习一下, ...

  7. 浅谈虚拟化技术下的云安全如何处置

    浅谈虚拟化技术下的云安全如何处置 近年来,云计算是目前非常热门的一个研究领域,其实它并不是一种全新的技术,而是许多技术的融合体,包括分布式计算.动态和拓展等各种各样的技术算法,而虚拟化技术是云计算里最 ...

  8. 技术贴:asp.net实现唯一账户在线 禁止同一帐号同时在线 asp.net实现您的帐号在别处登录,您已被迫下线!...

    技术贴:asp.net实现唯一账户在线 禁止同一帐号同时在线 asp.net实现您的帐号在别处登录,您已被迫下线! 原文 http://www.cnblogs.com/cdemo/p/3386534. ...

  9. 技术创业需胆识 谈IT技术人员的创业 (http://www.cnblogs.com/dudu/archive/2007/05/27/761740.html)...

    技术创业需胆识 谈IT技术人员的创业 作者:李立辉 我自己介绍一下:本人96年西点毕业,学的是无线通信,柳传志是我的校友,后来分配到北京巨龙做交换机,98年去了深圳中兴,当时看到中兴日益强大,和华为的 ...

  10. 浅谈.NET技术公司的实习生培养

    浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...

最新文章

  1. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
  2. ssl2648-线段树练习5【线段树】
  3. pycharm 调试_把xlwings盘顺溜:xlwings连接到Pycharm进行调试,以及xlwings转换器等的使用...
  4. java与freemarker中map的遍历
  5. Linux中命令选项及参数简介
  6. Polymer元素和AngularJS指令有什么区别?
  7. .NET 基础一步步一幕幕[out、ref、params]
  8. @my_decorator
  9. “仿QQ局域网聊天软件”项目-常用编程技巧总结
  10. sql字符串拼接,转义
  11. 常见逻辑谬误 -推断不当
  12. 计算机无法继续安装程序,电脑提示nvidia安装程序无法继续 如何解决 - 驱动管家...
  13. python在线编辑器编译excel_如何利用ONLYOFFICE将在线文档编辑器集成到Python Web应用程序中?...
  14. Linux下设置网卡速率 降低网卡速度
  15. 爱普生发布特殊3D眼镜:内建Google专门开发的安卓系统
  16. 视频工作室必备利器——群晖NAS
  17. 实战:浪潮服务器安装凝思 6.0.8 版本操作系统
  18. 速腾聚创激光雷达部署
  19. IGF1重组人胰岛素样生长因子-1解决方案
  20. 将字符串“abc123“转化为 字符串“a21cb3“JAVA实现

热门文章

  1. 如何编译并修改FBReader的package(安卓平台)
  2. 文字处理技术:吾知道他们听不懂,为何讲了一把WP布局
  3. 同样是编译jogl,不同平台的编译速度相差几十倍?
  4. LINUX下载编译ass
  5. JDK版本变化也太快了,意义有多大?
  6. 南宁公交有两个应用付费通道,互不通用
  7. 管理感悟:建议工作文档多使用表格EXCEL
  8. 解决安卓的permission denied for this window type问题
  9. 析构语意学(Semantics of Destruction)
  10. 计算机三级网络技术路由,2009计算机三级网络技术:如何上网高效率宽带路由优化技巧放送...