Unobtrusive JavaScript 是什么?

Unobtrusive JavaScript 是什么?

<!-- 以下是常规Javascript下写出来的Ajax --> < div id ="test" > < 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 > </ div >
<!-- 以下是Unobtrusive Javascript下写出来的Ajax --> < div id ="test" > < a data-ajax ="true" data-ajax-method ="GET" data-ajax-mode ="replace" data-ajax-update ="#test" href ="http://www.cnblogs.com/" > 测试 </ a > </ div >

  以上的代码分别是MVC3在“关闭”和“开启”Unobtrusive JavaScript 后生成的 Ajax.ActionLink。

  那Unobtrusive JavaScript到底是什么呢?简单地来说,就是一种代码分离的思想,把行为层和表现层分离开。具体的可以查看维基百科下对Unobtrusive JavaScript的解释。

  Unobtrusive JavaScriptin ASP.NET MVC 3

  Unobtrusive JavaScript 的好处显而易见,但是如何在MVC3使用Unobtrusive JavaScript呢?

  1、引用相应的Javascript文件

< script src ="@Url.Content(" ~/Scripts/jquery-1.4.1.min.js")" type ="text/javascript" ></ script > < script src ="@Url.Content(" ~/Scripts/jquery.unobtrusive-ajax.min.js")" type ="text/javascript" ></ script > < script src ="@Url.Content(" ~/Scripts/jquery.validate.min.js")" type ="text/javascript" ></ script > < script src ="@Url.Content(" ~/Scripts/jquery.validate.unobtrusive.min.js")" type ="text/javascript" ></ script >

  这四个文件包含在 MVC 3 的 Scripts 文件夹中,直接引用即可。

  值得注意的是:jquery.unobtrusive-ajax.min.js 和 jquery.validate.unobtrusive.min.js 是两个用来让 jquery 支持 Unobtrusive JavaScript 的库。在 jQuery 官网上看不到,打开后发现,原来是微软自己写的。另外,以前用来实现 MVC Ajax 和客户端验证的三个文件 MicrosoftAjax, MicrosoftMvcAjax.js, MicrosoftMvcValidation.js 不需要再引用了。原因就是因为,微软在 MVC 3 使用 jQuery 来实现 Ajax 了,而上面两个 javascript 库就相当于是两个 Adapter(适配器)

  2、开启 Unobtrusive JavaScript

  MVC3中的Web.Config文件中默认多了两个配置项:

image  这里是一个全局设置,你可以打开或者关闭。

  另外,你也可以在任何一个 Action 或 Controller 中执行以下代码,灵活地进行控制,来处理一些特殊的 Action 或 Controller。

HtmlHelper.ClientValidationEnabled = true; HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

  3、如果不需要用 Unobtrusive JavaScript 呢?

  如果不需要用的话根据上面的方法关闭即可。但是要注意一点!这时候,如果你需要用 Ajax 或者客户端验证,务必引用MVC3以前版本中的三个 javascript文件:MicrosoftAjax, MicrosoftMvcAjax.js, MicrosoftMvcValidation.js。

  否则就不能实现Ajax 和客户端验证了。

  Unobtrusive Ajax in ASP.NET MVC 3

  原文:《Unobtrusive Ajax in ASP.NET MVC 3》

  关于 AjaxOptions

  MVC 中 AjaxHelper 的扩展方法,提供了一系列的 Ajax 方法,例如:ActionLink RouteLink, BeginForm, BeginRouteForm 等。它们的使用方法和 HtmlHelper很像,主要的区别就在于 AjaxHelper 有一个 AjaxOptions 参数。

public class AjaxOptions { public string Confirm { get ; set ; } public string HttpMethod { get ; set ; } public InsertionMode InsertionMode { get ; set ; } public int LoadingElementDuration { get ; set ; } public string LoadingElementId { get ; set ; } public string OnBegin { get ; set ; } public string OnComplete { get ; set ; } public string OnFailure { get ; set ; } public string OnSuccess { get ; set ; } public string UpdateTargetId { get ; set ; } public string Url { get ; set ; } }

  这些属性会告诉 MVC 如何生成你的 Ajax 代码。

  传统的生成方式

  当 unobtrusive 模式被关闭的时候,MVC 会把代码写在你的 <a> 标签或者 <form> 标签中,并且靠 MicrosoftAjax.js 和 MicrosoftMvcAjax.js 来执行相应的代码。

< form action ="/ajax/callback" id ="form0" method ="post" onclick ="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));" onsubmit ="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, loadingElementId: 'loading', updateTargetId: 'updateme' });" >

  MVC1 和 MVC2 中就是这样做的。

  依赖于 Unobtrusive JavaScript 的生成方式

  当 unobtrusive 模式打开的时候,代码彻底的改变了,而且是那么地简洁!

< form action ="/ajax/callback" data-ajax ="true" data-ajax-loading ="#loading" data-ajax-mode ="replace" data-ajax-update ="#updateme" method ="post" >

  你会发现这些HTML代码是非常容易读懂的。

  映射AjaxOptions属性

  下表列出了 AjaxOptions 和 HTML 5 的映射关系

AjaxOptionsHTML attribute
Confirmdata-ajax-confirm
HttpMethoddata-ajax-method
InsertionModedata-ajax-mode *
LoadingElementDurationdata-ajax-loading-duration **
LoadingElementIddata-ajax-loading
OnBegindata-ajax-begin
OnCompletedata-ajax-complete
OnFailuredata-ajax-failure
OnSuccessdata-ajax-success
UpdateTargetIddata-ajax-update
Urldata-ajax-url

  除了这些属性外,还有一个额外的 data-ajax="true" 属性,代表这是一个 Ajax 方法。

  * = data-ajax-mode 只有在设置 UpdateTargetId 被设置后才有效。

  ** =  data-ajax-loading-duration 只有在 LoadingElementId 被设置后才有效。

  Ajax 回调

  传统 Ajax 和 unobtrusive JavaScript 的主要区别就在于 Ajax 的回调。当所有的回调函数都被定义在 Ajax 库中以后,你的代码就会变成这种理想化的风格。

  当你在 MVC 3 中使用 unobtrusive Ajax 的时候,四个基本的回调函数会被因设为 jQuery.Ajax 的函数。

  OnBegin => “beforeSend”

  OnComplete => “complete”

  OnFailure => “error”

  OnSuccess = > “success”

  你可以给他们传递一个函数名,或一段匿名函数作为处理函数。如果你的处理函数是一个函数名,并且参数列表符合Ajax标准,那么 jQuery.Ajax 便会把值传递给这个函数并执行。如果是匿名函数的话,过程大同小异。

  Ajax 回调函数的参数列表:

  xhr : XMLHttpRequest 对象

  status : 仅限 OnBegin

  error : 仅限 OnFailure

  data : 仅限 OnSuccess

  Unobtrusive Client Validation in ASP.NET MVC 3

  原文:《Unobtrusive Client Validation in ASP.NET MVC 3》

  传统的生成方式

  一下是 MVC 数据验证框架下对于 Model 的描述(这部分不变):

public class ValidationModel { [Required] public string FirstName { get ; set ; } [Required, StringLength( 60 )] public string LastName { get ; set ; } [Range( 1 , 130 )] public int Age { get ; set ; } }

  当开启客户端验证后:(具体开启方法和 Unobtrusive Javascript 大同小异,请看第二部分)

  当 unobtrusive JavaScript 关闭后,你会看到以上代码(和 MVC 2 中相同)。你会发现在后面多了一段 Javascript 代码,而这里,便是对表单验证的核心。

  依赖于 Unobtrusive JavaScript 的生成方式

  开启 Unobtrusive Javascript 后,代码完全改变了:

< label for ="FirstName" > FirstName </ label > < input class ="text-box single-line" data-val ="true" data-val-required ="The FirstName field is required." id ="FirstName" name ="FirstName" type ="text" value ="" /> < span class ="field-validation-valid" data-valmsg-for ="FirstName" data-valmsg-replace ="true" ></ span > < label for ="LastName" > LastName </ label > < input class ="text-box single-line" data-val ="true" data-val-length ="The field LastName must be a string with a maximum length of 60." data-val-length-max ="60" data-val-required ="The LastName field is required." id ="LastName" name ="LastName" type ="text" value ="" /> < span class ="field-validation-valid" data-valmsg-for ="LastName" data-valmsg-replace ="true" ></ span > < label for ="Age" > Age </ label > < input class ="text-box single-line" data-val ="true" data-val-number ="The field Age must be a number." data-val-range ="The field Age must be between 1 and 130." data-val-range-max ="130" data-val-range-min ="1" data-val-required ="The Age field is required." id ="Age" name ="Age" type ="text" value ="" /> < span class ="field-validation-valid" data-valmsg-for ="Age" data-valmsg-replace ="true" ></ span >

  其中最大的改变就是下面的 Javascript 代码消失了,转而变为 HTML 5 的各种属性。

  属性是如何生成的

  当表单中的一项在后端代码中有数据验证的时候,MVC 会现在 它的属性中加上  data-val="true",并且讲所有规则以 data-val-rulename="message" 的形式,加在属性上。

  如果想使用默认的客户端验证信息,你只要把属性值留空,那么客户端验证会自动生成形如 data-val-rulename-paramname="paramvalue" 的属性。

  桥接 HTML 和 jQuery : 适配器

  写一个客户端验证有两个步骤:1、为 jQuery 验证编写验证规则,2、在 HTML 代码中加上属性,并且使用适配器转换为对应的 jQuery 验证规则。(这个在非 MVC 中也适用)

  你可以调用 jQuery.validator.unobtrusive.adapters. 来编写适配规则。

  这里有三个方法能帮助你注册三种很常规的适配器。(addBool, addSingleVal, and addMinMax)

  具体的方法大家可以看一下原文,因为 jquery.validate.unobtrusive.min.js 已经把这些适配规则都写好了,所以不加以阐述了,如果想了解原理的话可以去看一下~

  ENDING

  最后,还不太了解 MVC 数据验证的朋友可以看一下我的另一篇文章:深入浅出 MVC 数据验证 2.0 [附演示源码]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现基于 AJAX 的级联下拉菜单可以按照以下步骤进行: 1. 引入 jQuery 库和 AJAX 请求的相关库。 ```html <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.min.js"></script> ``` 2. 在页面上定义两个下拉菜单,一个是父级菜单,一个是子级菜单。 ```html <select id="parent" name="parent" onchange="getChildren()"> <option value="">请选择父级菜单</option> <option value="1">菜单1</option> <option value="2">菜单2</option> <option value="3">菜单3</option> </select> <select id="child" name="child"> <option value="">请选择子级菜单</option> </select> ``` 3. 编写 AJAX 请求的代码,获取子级菜单的数据,并根据数据动态生成子级菜单的选项。 ```javascript function getChildren() { var parentId = $("#parent").val(); if (parentId == "") { $("#child").html("<option value=''>请选择子级菜单</option>"); return; } $.ajax({ type: "GET", url: "/menu/getChildren", data: { parentId: parentId }, dataType: "json", success: function (data) { var html = "<option value=''>请选择子级菜单</option>"; $.each(data, function (i, item) { html += "<option value='" + item.id + "'>" + item.name + "</option>"; }); $("#child").html(html); }, error: function () { alert("请求失败,请稍后再试!"); } }); } ``` 4. 在后台编写获取子级菜单数据的代码,并返回 JSON 格式的数据。 以上就是基于 AJAX 的级联下拉菜单的实现步骤。需要注意的是,后台返回的子菜单数据应该是以 JSON 格式返回,前端通过 AJAX 请求获取到数据后,需要动态生成子级菜单的选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值