http://www.cnblogs.com/jyan/archive/2012/07/23/2604958.html

除了传统的Ajax方法之外,MVC提供了AjaxHelper类:

Helper method Description
Ajax.ActionLink Creates a hyperlink to a controller action that fires an Ajax request when clicked
Ajax.RouteLink Similar to Ajax.ActionLink, but generates a link to a particular route instead of a named controller action
Ajax.BeginForm Creates a form element that submits its data to a particular controller action using Ajax
Ajax.BeginRouteForm Similar to Ajax.BeginForm, but creates a form that sub- mits its data to a particular route instead of a named control- ler action
Ajax.GlobalizationScript Creates an HTML script element that references a script that contains culture information
Ajax.JavaScriptStringEncode Encodes a string to make sure that it can safely be used inside JavaScript

使用AjaxHelper可以很方便的实现Ajax请求,Aps.net MVC提供了jQuery和Microsoft Ajax类库两种方式来实现,使用何种方式取决于我们Web.config配置:

 <add key="UnobtrusiveJavaScriptEnabled" value="true" />

当设置为true时,将使用jQuery方式实现请求,生成的链接如下:

 <a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#test" href="http://www.cnblogs.com/">测试</a>

反之则使用Microsoft Ajax类库实现

<a href="http://www.cnblogs.com/" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'GET', updateTargetId: 'test' });">测试</a>

在我们创建项目时,该值默认为true。这种情况下吗,我们要在页面中引入相应的js类库:

@section scripts{
<script type="text/javascript" src=" @Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
}

下面重点了解Ajax.ActionLink()和Ajax.BeginForm()这两个Helper.

Ajax.ActionLink():

  向客户端输入一个链接地址,当单击这个链接时可以异步调用Controller中的方法,Ajax.ActionLink()方法有许多重载,我们这里举例说明其中一个比较常用的重载:

  public static string ActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName, object routeValues, AjaxOptions ajaxOptions);

  linkText:是显示在客户端的文本

  actionName:是Action的名字,默认情况下我们会使用当前的Controller。

  routeValues:将传入到Controller中方法的参数

  ajaxOptions:配置Ajax的一些选项,看完下面的例子我们再详细讲解这个配置选项。

参数
Confirm 获取或设置提交请求之前,显示在确认窗口中的消息。
HttpMethod 获取或设置 HTTP 请求方法(“Get”或“Post”)。
InsertionMode 获取或设置指定如何将响应插入目标 DOM 元素的模式。
LoadingElementId 获取或设置加载 Ajax 函数时要显示的 HTML 元素的 id 特性。
OnBegin 获取或设置更新页面之前,恰好调用的 JavaScript 函数的名称。
OnComplete 获取或设置实例化响应数据之后但更新页面之前,要调用的 JavaScript 函数。
OnFailure 获取或设置页面更新失败时,要调用的 JavaScript 函数。
OnSuccess 获取或设置成功更新页面之后,要调用的 JavaScript 函数。
UpdateTargetId 获取或设置要使用服务器响应来更新的 DOM 元素的 ID。
Url 获取或设置要向其发送请求的 URL。

以之前的GuestBook为例,在列表页面(Index.cshtml),使用Ajax来显示选中行的详细信息:

Index.cshtml页面源码:

@foreach (MvcApplication5.Models.GuestbookEntry item in ViewBag.Entries)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Message)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateAdded)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id }) |
@Ajax.ActionLink("AjaxContentController", "getEntry", new { id = item.Id }, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "detailsID", InsertionMode = InsertionMode.Replace })
@Ajax.ActionLink("AjaxJsonController", "JsonDetails", new { id = item.Id }, new AjaxOptions { HttpMethod = "Post", InsertionMode = InsertionMode.Replace, OnSuccess = "Show" })
@Ajax.ActionLink("AjaxPartialView", "Details", new { id = item.Id }, new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "detailsID" })
</td>
</tr>
} </table>
<div id="detailsID"></div>

我们将使用ActionLink分别异步请求ContentController,Json格式的Controller和PartialView格式的Controller来显示详细信息:

1:Ajax异步请求ContentController

ContentController直接以字符串形式返回实例的内容,在Index.cshtml中使用ActionLink,如下:

@Ajax.ActionLink("AjaxContentController", "getEntry", new { id = item.Id }, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "detailsID", InsertionMode = InsertionMode.Replace })

相应的Controller:

public string getEntry(int id = 0) {
GuestbookEntry entry = _db.Entries.First(c => c.Id == id);
return entry.Details;
}

结果:返回的内容直接更新到ID属性为detailsID的DIV中:

2: 使用Json格式返回

在Index.cshtml中使用ActionLink,如下:

@Ajax.ActionLink("AjaxJsonController", "JsonDetails", new { id = item.Id }, new AjaxOptions { HttpMethod = "Post", InsertionMode = InsertionMode.Replace, OnSuccess = "Show" })

相应的Controller:

 public ActionResult JsonDetails(int id = 0)
{
GuestbookEntry entry = _db.Entries.First(c => c.Id == id);
return Json(entry, JsonRequestBehavior.AllowGet);
}

注意:在使用Json格式返回数据时,由于安全原因,只接收Post请求,因此在这里使用JsonRequestBehavior.AllowGet来允许Get方式请求。

同时需要在Index.cshtml中添加请求成功的相应函数Show:

<script type="text/javascript">
        function Show(data) {
            $("#detailsID").html("姓名:" + data.Name + " 消息:" + data.Message);
        }
 </script>

结果:在响应函数中更新ID属性为detailsID的DIV内容:

3使用PartialView来返回数据

PartialView类似于WebForms中的用户自定义控件,可以用来显示一些公共的信息。在Index.cshtml中

@Ajax.ActionLink("AjaxPartialView", "Details", new { id = item.Id }, new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "detailsID" })

相应的Controller:

public ActionResult Details(int id = 0)
{
GuestbookEntry entry = _db.Entries.First(c => c.Id == id);
if (Request.IsAjaxRequest())
{
return PartialView(entry);
}
return View(entry);
}

在这里我们使用Request.IsAjaxRequest()来判断是否为Ajax请求,如果是则返回PartialView,否则返回View

结果:返回的内容直接更新到ID属性为detailsID的DIV中:

 Ajax.BeginForm

打开Create.cshtml页面,现在的页面使用的是Html.BeginForm()进行表单提交的,下面我们将它修改为Ajax方式提交

@model MvcApplication5.Models.GuestbookEntry

@{
ViewBag.Title = "Create";
} <h2>Create</h2> @using (Html.BeginForm()) {
@Html.ValidationSummary(true) <fieldset>
<legend>GuestbookEntry</legend> <div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div> <div class="editor-label">
@Html.LabelFor(model => model.Message)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
</div> <p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

修改后的页面如下:

@model MvcApplication5.Models.GuestbookEntry
<script type="text/javascript" src=" @Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
<script type="text/javascript">
function success(data) {
alert(data);
}
</script>
@{
ViewBag.Title = "Create";
} <h2>Create</h2> @using (Ajax.BeginForm(new AjaxOptions {
HttpMethod="Post",
OnSuccess = "success"
}))
{
@Html.ValidationSummary(true) <fieldset>
<legend>GuestbookEntry</legend> <div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div> <div class="editor-label">
@Html.LabelFor(model => model.Message)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
</div> <p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

而相应的Controller没有任何变化。

[HttpPost]
public ActionResult Create(GuestbookEntry entry)
{ if (ModelState.IsValid)
{
entry.DateAdded = DateTime.Now;
_db.Entries.Add(entry);
_db.SaveChanges();
return Content("New Entry successfully added.");
}
else {
return View();
}
}

附注:

在web.config中增加client side validation and unobtrusive javascript 两个配置
<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
客户端验证是基于jquery.validate.js和jquery.validate.unobtrusive.js的,当你在一个view中包含了这两个文件时,你在Model中声明的data annotation才会被解析。这时你打开你表单查看页面的源代码,可以看到相应的input fields都具有包含验证规则的HTML5的data-*属性,这些属性将被Microsoft unobtrusive validation script读取并配置jquery validate.
unobtrusive javascript 是基于jQuery的,在使用AjaxHelper时(ActionLink 或者BeginForm),他会自动向你的控件中添加data-属性(HTML5 属性),这些属性之后会被jquery.unobtrusive-ajax.js进行解析,所以要在页面中引入该文件。
例如:
@Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })
生成的代码是:
<a data-ajax="true" data-ajax-mode="replace" data-ajax-update="#myResults" href="/Home/GetTime?zone=utc">UTC</a>
jquery.unobtrusive-ajax.js作用就是解析data-ajax-mode等属性,然后发出ajax请求的(可以看下这个文件的代码),乱码就是因为你没有引入该文件
如果不想使用jquery,改为false即可
<add key="UnobtrusiveJavaScriptEnabled" value="false" /> 
同时需要在页面中引入MicrosoftAjax.js,MicrosoftMvcAjax.js
 
 
 

MVC 之AjaxHelper的更多相关文章

  1. 【Asp.net MVC】AJAXHelper 和jQueryAjax

    在ASP.NET MVC中,有一个官方提供的AJAXHelper帮助我们做AJAX相关的东西.我用传统的jQuery AJAX技术和AJAXHelper分别实现同一个demo,特此记录一下. 由于是在 ...

  2. 转载:Unobtrusive JavaScript in ASP.NET MVC 3 隐式的脚本在MVC3

    Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--> <div id="test"> &l ...

  3. Asp.Net MVC part4 异步、校验、区域Area

    异步方式1:使用jquery的异步函数方式2:使用MVC的AjaxHelper行为的返回值设置:JsonResult对象,使用Json方法接收一个对象,在内部会完成对象的js序列化,向输出流中输出js ...

  4. Unobtrusive JavaScript 是什么?

    Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--><div id="test">< ...

  5. .NET MVC AjaxHelper

    我们首先必须开启 非入侵式 Ajax:导入Jquery和unobtrusiveAjax文件 已经默认开启客户端验证 和 非侵入式js <add key="ClientValidatio ...

  6. MVC中的Ajax(AjaxHelper)

    authour: chenboyi updatetime: 2015-04-30 20:47:49 friendly link:   目录 1,思维导图 2,ActionLink() 3,BeginF ...

  7. asp.net mvc AjaxHelper 获取 JSON 的方法

    默认的 AjaxHelper 没有提供获取 JSON 的方法,只提供获取 html 然后更新指定元素的方法,不过,经测试发现还是有办法的,由于 AjaxOptions 对象的 OnSuccess 属性 ...

  8. mvc的model验证,ajaxhelper,验证机制语法

    ajaxhelper: onsuccess是调用成功后显示方法,还有一个方法是调用前显示 model验证: 控件前端验证: 需要引入的JS 其中第二个是ajaxhelper的必须验证 后台的两个同名不 ...

  9. AjaxHelper学习,ajax,microsoft,mvc,asp.net

    index.cshtml @using (Ajax.BeginForm("ContentAjax", new AjaxOptions { UpdateTargetId = &quo ...

随机推荐

  1. jsp中文乱码终极解决方法

    转载http://blog.csdn.net/csh624366188/article/details/6657350 一 找出问题的根源    乱码可能出现的地方:1 jsp页面中          ...

  2. SSM与SSH的对比

    struts与springMVC的对比: 1.核心控制器(前端控制器.预处理控制器):负责接收页面请求和返回数据给页面. 对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有 ...

  3. 微信小程序,页面分享

    onShareAppMessage: function () { return { title: '微信小程序联盟', desc: '最具人气的小程序开发联盟!', path: '/page/user ...

  4. 关于NUL

    问题:正常的order by不起作用了,如下图 分析:使用notepad++打开,发现 NUL以字符'\0'作为字符串结束标志.'\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCI ...

  5. PlantUML类图

    PlantUML类图   雨客 2016-04-08 11:38:03 浏览796 评论0 摘要: 类之间的关系 PlantUML用下面的符号来表示类之间的关系: 泛化,Generalization: ...

  6. PHP函数方法

    补充一个P可以HP的特点函数:动态调用 function t(){ echo "welcome"; } function t2(){ echo "beatch" ...

  7. PHP提取链接批量下载

    2014年年初的时候,曾经受委托完成一个视频网站,那时最大的技术障碍是一个大视频比如500MB,在一个带宽环境不怎么快的服务器(比如1Mbps)上提供播放的问题. 这里会遇到两种情况,第一种情况是客户 ...

  8. Spring Boot 使用IntelliJ IDEA创建一个web开发实例(四)

    多环境配置 1. 在springBoot多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,例如: (1)appli ...

  9. PHP与Ajax

    如何用PHP接收JSON格式数据 1.一般来说,我们直接用$_POST $_REQUEST $_GET这样的超全局变量接收就好了 <?php $obj_temp=$_POST['data']; ...

  10. Web中的宽和高

    不同的宽高定义 //网页可见区域宽 document.body.clientWidth //网页可见区域高 document.body.clientHeight //网页可见区域宽(包括边线和滚动条的 ...