Ajax代表异步JavaScript和XML

一、Jquery

1、jquery特性
(1)、jquery函数:用$符号做为别名

如:调用 jQuery函数($),并向其中传递了一个匿名的JavaScript函数作为第一个参数。
当传递一个函数作为第一个参数时,Jquery就会假定这个函数是要浏览器完成构建Html页面中的文档对象模型(DOM)后立即执行,
换句话说,这个函数在 从服务器加载完HTML页面之后执行。这样就可以安全地执行函数中与DOM冲突的脚本,我们把这种情况称为“ DOM准备”事件。
<script type="text/javascript">
        $(function () {
            alert("aa");
        });
    </script>
如:向jquery函数 传递一个字符串"#album-list img",jquery把这个字符串解释为选择器。选择器会告知jquery需要在DOM中查找的元素。
$(function () {
            $("#album-list img").mouSEOver(function () {
                $(this).animate({ height: '+=25',width: '+=25' })
                .animate({height:'-=25',width:'-=25'});
            });
        });
(2)、jquery选择器
选择器是指传递给jquery函数的、用来在DOM中选择元素的字符串。
常用的选择器:
$("#header") 查找id值为"header"的元素
$(".editor-label") 查找class名为".editor-label"的所有元素
$("div") 查找所有<div>元素
$("#header div") 查找id值为"header"元素的所有后代<div>元素
$("#header>div")查找id值为"header"元素的所有子<div>元素
$("a:even") 查找编号为偶数的锚标签
(3)、jquery事件
示例:
$("#album-list img").mouSEOver(function(){
    animateElement($(this));
});
function animateElement(element){
     element.animate({height:'+=25',width:'+=25'})
     .animate({height:'-=25',width:'-=25'});
}
示例:当用户在标签上移动鼠标时,锚标签就会改变外挂
$("a").mouSEOver(function(){
   $(this).addClass("highlight");
}).mouSEOut(function(){
   $(this).removeClass("highlight");
});
$("a").mouSEOver(function(){....}).mouSEOut(function(){....}); 方法链

$("a").hover(function(){
     $(this).toggleClass("highlight");
});
(4)、jQuery和Ajax

jQuery包含了向Web服务器回发异步请求所需要的所有功能。


2、非侵入式JavaScript

JavaScript代码和标记分离,可以将所有需要的脚本代码打包到.js文件中。


3、jQuery的用法

每新MVC项目都包含一个Scripts文件夹,其中带有多个.js文件。
jQuery核心库是一个名为jquery-<版本号>.js的文件

添加jquery脚本引用:

<script src="~/Scripts/jquery-1.10.2.js"></script>

注意:ASP.NET MVC 的Razor视图引擎会把这里~操作符解析为当前网站的根目录。
引用jQuery必须在,我们编写的js之前引用。


如果想更新到最新版本的jQuery,就必须在代码中查找脚本引用,并使用新版本号加以替换。
我们使用内置的、版本无关的jQuery脚本捆绑。

如:/Views/Shared/_Layout.cshtml 母版中的脚本引用采用了这种方法。
@Scripts.Render("~/bundles/jquery")
除了简化将来的脚本更新,这种捆绑引用还提供了其他许多好处,例如在发布模式下自动使用微小脚本,以及将脚本引用集中到一个位置,从而只需在一个位置进行更新。

小知识点:

@RenderSection("scripts",required: false)

在子页面中可以使用 @section ScriptSection{} 来引用js或者css。这个作用相当于在布局页中定义了一个占位,在子页面中去填充这个占位


注意:@Scripts.Render调用将渲染/App_Start/BundleConfig.cs中预定义的“jquery”脚本捆绑。
这个捆绑利用了Asp.net中的捆绑和微小特性,该特性利用版本号中包含的通配符匹配,自动优先使用jQuery的轻量版本。

public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
}


(1)、jQuery和NuGet

Asp.net项目模板实际上使用了NuGet程序包将jQuery库包含进来或更新到jQuery的新版本。

(2)、自定义脚本
在/Scripts/App子目录中,添加名称为MusicScripts.js文件,并在里面写入脚本$(function(){..........});。
再在页面中引用js文件。引用的js文件,必须在引用jQuery文件后面。


(3)、在节中放置脚本 @section Scripts{......}
@section Scripts{
<script type="text/javascript">
$(function () {
alert("aa");
});
</script>
}


脚本会添加到视图的底部,页面@RenderSection("scripts",required: false)的位置
如下图:


(4)、Scripts目录下的其他文件

_references.js 确定在整个项目的全局JavaScript智能感知中包含哪些库

bootstrap.js前端开发的工具包 说明:http://v3.bootcss.com/css/#tables-condensed

respond.js bootstrap需要用到的js

modernizr.js 老版本浏览器启用新的Html5元素


二、Ajax辅助方法

创建表单和指向控制器操作的异步链接,需要引用 jquery.unobtrusive-ajax.js。

1、添加脚本

使用NuGet在项目中添加非侵入式Ajax脚本。


联机搜索“Microsoft jQuery Unobtrusive Ajax”



添加脚本引用:

@section Scripts{     
       <script src="....."></script>
       <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
    }


2、Ajax的ActionLInk方法
创建一个具有异步行为的锚标签。

_Layout.cshtml 中@RenderSection("scripts",required: false) 后添加异步按钮

<div id="dailydeal">
        @Ajax.ActionLink("链接文本","DailyDeal",null,new AjaxOptions
            {
                UpdateTargetId = "dailydeal",InsertionMode = InsertionMode.Replace,HttpMethod = "GET"
            },new { @class = "btn btn-primary" }
        )
    </div>

public ActionResult DailyDeal()
        {
            return PartialView();
        }


点击按钮后,会将DailyDeal视图异步替换 按钮内容。


3、HTML5特性

ActionLInk方法渲染后的代码:

<div id="dailydeal">
        <a class="btn btn-primary" data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#dailydeal" 

href="/Home/DailyDeal">链接文本</a>
    </div>

在HTML中看不到脚本代码(非入侵式JavaScript),并且大多数的编码特性都有data-前缀。
HTML5规范为私有应用程序状态保留了data-特性。
jquery.unobstrusive-ajax文件的目的是查找特定的data-特性,然后操作元素使其表现出不同行为。
如:
$(function(){
$("#a[data-ajax]=true")
});
jQuery查找data-ajax特性值为True,执行异步行为。


4、Ajax表单

效果:



代码:

当用户点击提交按钮时,浏览器会向控制器HomeController的ArtistSearch操作发送异步GET请求

<script type="text/javascript">
            function searchFailed()
            {
                $("#searchresults").html("没找到数据");
            }
        </script>

        @using (Ajax.BeginForm("ArtistSearch","Home",new AjaxOptions
            {
                InsertionMode = InsertionMode.Replace,HttpMethod="GET",OnFailure = "searchFailed",//查询失败,执行JS函数searchFailed
                LoadingElementId = "ajax-loader",//正在查询时,显示图片ID:ajax-loader
                UpdateTargetId="searchresults"//查询结束后,更新DOM的Id
            }))
        { 
            <input type="text" name="q"/>
            <input type="submit" value="search"/>
            <img id="ajax-loader"
                 src="@Url.Content("~/Images/ajax-loader.gif")"
                 style="display:none"
                 />
        }
        <div id="searchresults">

        </div>

Model

namespace WebApplication1.Models
{
    public class Artist
    {
        public string Name { get; set; }
    }
}


控制器
public ActionResult ArtistSearch(string q)
        {
            var artists=GetArtists(q);
            return PartialView(artists);//返回部分视图PartialView
        }


        private List<Artist> GetArtists(string searchString)
        {
            List<Artist> Artist = new List<Artist>(){
                new Artist(){Name="aa"},new Artist(){Name="bb"},new Artist(){Name="bbc"}
            };
            return Artist.Where(a => a.Name.Contains(searchString))
                         .ToList();
        }

视图
@model IEnumerable<WebApplication1.Models.Artist>
<div>
    <ul>
        @foreach (var item in Model)
        {
           <li>@item.Name</li>
        }
    </ul>
</div>

三、客户端验证

MVC框架的客户端验证是默认开启的。
1、JQuery验证
jquery.validate.js文件
jquery.validate.unobtrusive.js 非入侵Js


web.config文件中的Ajax设置
<appSettings>
<add key="ClientValidationEnabled" value="true"/><!--客户端验证-->
<add key="UnobtrusiveJavaScriptEnabled" value="true"/><!--非入侵Js-->

</appSettings>


2、自定义验证

服务器端验证方法:

/// <summary>
    /// ValidationAttribute:验证属性基类
    /// </summary>
    public class MaxWordsAttribute : ValidationAttribute
    {
        public MaxWordsAttribute(int maxWords)
            : base("字符串最长{0}")
        {
            MaxWords = maxWords;
        }
        public int MaxWords { get; set; }
        protected override ValidationResult IsValid(
            object value,ValidationContext validationContext)
        {
            if (value != null)
            {
                var wordCount = value.ToString().Split(' ').Length;
                if(wordCount>MaxWords)
                {
                    return new ValidationResult(
                        FormatErrorMessage(validationContext.displayName)
                        );

                }
            }
            return ValidationResult.Success;
        }

[required(ErrorMessage="Title非空")]
        [MaxWords(10)]
        public string Title { get; set; }

客户端验证方法:


第1步:IClientValidatable接口定义了单个方法:GetClientValidationRules 方法返回规则 将信息序列化为data特性

public class MaxWordsAttribute : ValidationAttribute,
IClientValidatable
{
public MaxWordsAttribute(int wordCount)
: base("字符串最长{0}")
{
WordCount = wordCount;
}
public int WordCount { get; set; }
protected override ValidationResult IsValid(
object value,
ValidationContext validationContext)
{
if (value != null)
{
var wordCount = value.ToString().Split(' ').Length;
if (wordCount > WordCount)
{
return new ValidationResult(
FormatErrorMessage(validationContext.displayName)
);


}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule>
GetClientValidationRules(ModelMetadata Metadata,ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(Metadata.GetdisplayName());
rule.ValidationParameters.Add("wordcount",WordCount);
rule.ValidationType = "maxwords";
yield return rule;
}

}


第2步:自定义验证脚本代码

/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
$.validator.unobtrusive.adapters.addSingleVal("maxwords","wordcount");

$.validator.addMethod("maxwords",function (value,element,maxwords) {
    if (value) {
        if (value.split(' ').length > maxwords) {
            return false;
        }
    }
    return true;
});

了解更多:百度 【ASP.NET MVC 5 客户端验证


推荐阅读:

http://www.jb51.cc/article/p-zejnifsl-bcv.html

http://www.jb51.cc/article/p-ekszwjrh-bcv.html

第8章 Ajax(Jquery、Ajax辅助方法、客户端验证)的更多相关文章

  1. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 在IOS9中的Cordova应用程序使用JQuery / Javascript的window.history问题

    在两个测试用例中唯一改变的是Cordova.js.解决方法我看到这是几个星期前,但我会发布这个,以防其他人遇到它.听起来它可能与iOS9中的哈希更改生成的导航事件有关.如果是这样,可以将其添加到index.html以禁用哈希侦听:

  4. iOS 5上的jQuery事件

    解决方法在Apple开发论坛上由一个人回答:我需要在将元素添加到DOM之后才绑定(),如下所示:

  5. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  6. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. 设置焦点到输入框和显示Android键盘使用jquery手机在pageshow

    我正在设置焦点到输入框,并显示Android键盘使用jquery手机网页显示.我从Web上尝试过很多选项.但是没有一个在模拟器和移动设备中都能按预期工作.这是代码:查找屏幕截图以供参考请咨询…解决方法对我有用的解决方案

  9. android – 如何在焦点()上以编程方式隐藏jquery mobile中的键盘

    我想在Focus()上隐藏键盘,但是当$(“.ui-input-text”).focus();它会自动打开键盘.我只是想隐藏在特定的屏幕上,我用document.activeElement.blur()测试;但它也没有关注()输入.解决方法提交表单时,iOS键盘可能不会自动关闭.这是一个非常实用的问题,因为不应要求用户手动关闭键盘,否则他们不会期望需要这样做.可以通过调用document.acti

  10. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部