1、Ajax需求,例子。
-----------------------ViewVideo.ashx
contex.Response.ContentType="text/html";
string strIsPostBack=context.Request["IsPostBack"];
bool isPostBack=Convert.ToBoolean(context.Request["IsPostBack"]);
if(string.IsNullOrEmpty(strIsPostBack))
{
ispostBack=false;
}
else
{
isPostBack=Convert.ToBoolean(strIsPostBack);
}
if(isPostBack)//如果是返回来的页面,则要统计
{//投票
string zan=context.Request["Zan"];
if(string.IsNullOrEmpty(zan))
{
SqlHelper.ExecuteNonQuery("Update T_ZanCai set CaiCount=CaiCount+1");
context.Response.Redirect("ViewVideo.ashx");
}
else
{
SqlHelper.ExecuteNonQuery("Update T_ZanCai set ZanCount=ZanCount+1");
context.Response.Redirect("ViewVideo.ashx");
}
}
else//如果只是进入这个页面,直接读出来。
{
int zanCount=(int)SqlHelper.ExecuteScalar("select top 1 ZanCount from T_ZanCai");
int caiCount=(int)SqlHelper.ExecuteScalar("select top 1 CaiCount from T_ZanCai");
var data=new {ZanCount=zanCount,CaiCount=caiCount};
string html=CommonHelper.RenderHtml("ViewVideo.htm",data);
context.Response.Write(html);
}
-----------------------ViewVideo.htm
<body>
<video src="diaosi.mp4" autoplay controls></video>//设置自动播放,html5里面的
<form action="ViewVideo.ashx" method="post">
<input type="hidden" name="IsPostBack" value="true"/>//设置隐藏字段,判断赞和踩
<p><input type="submit" name="Zan" value="赞"/>$Model.ZanCount</p>
<p><input type="submit" name="Cai" value="踩"/>$Model.CaiCount</p>
</form>
</body>
----------------------Test1.mdf
ZanCount int 允许为空
CaiCount int 允许为空
//这样就实现了赞和踩,但是。每点一次都要刷新重新进入视频。要实现Ajax刷新。
2、在HTML中使用JavaScript创建,XMLHTTPRequest对象来向服务器发出请求以及获得返回的数据。就像
JavaScript版的WebClient一样,在页面中由XMLHTTPRequest来发出,Http的请求和获得服务器的返回数据,
这样页面就不会刷新了。XMLHTTPRequest是AJAX的核心对象。
3、XMLHTTPRequest对象的用法。
------------------------------------------------------ViewVideo2.htm重新弄个页面
<head>
<script type="text/javascript">
function zan()
{
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject
('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性。XHR,不同浏览器创建xmlhttprequest不一样,
这种方法是兼容好多浏览器的创建。
xmlhttp.open("POST", "ZanCai.ashx?action=Zan", true);
//“准备”向服务器的GetDate1.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求
//DRY:不要复制粘贴代码 要尽量封装成js库。
//AJAX是异步的,并不是等到服务器端返回才继续执行
xmlhttp.onreadystatechange = function (){
if (xmlhttp.readyState == 4)
//readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)
、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成)
{
if (xmlhttp.status == 200) //如果Http状态码为200则是成功
{
//alert(xmlhttp.responseText);
document.getElementById("ZanCount").innerHTML = xmlhttp.responseText;
//只有返回成功了,并且200才进行处理。 //responseText为服务
器端返回的报文正文
}
else
{
alert("AJAX服务器返回错误!");
}
}
}
//不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!!
xmlhttp.send();
//这时才开始发送请求。并不等于服务器端返回。请求发出去了,我不等!去监听
onreadystatechange吧!
}
</script>
</head>
<body>
<video src="diaosi.mp4" autoplay controls></video>//设置自动播放,html5里面的
<p>
<input type="submit" name="Zan" value="赞" onclick="zan()"/>//加入一个onclick
<label id="ZanCount"></label>
</p>
<p>
<input type="submit" name="Cai" value="踩"/>
<label id="CaiCount">
</lable>
</p>
</body>
---------------------------------------------ZanCai.ashx
string action=context.Request["action"];
if(action=="Zan")
{
SqlHelper.ExecuteNonQuery("Update T_ZanCai set ZanCount=ZanCount+1");//加1
int zanCount=(int)SqlHelper.ExecuteScalar("select top 1 ZanCount from T_ZanCai");//取最新
context.Response.Write(zanCount);
}
else
{
SqlHelper.ExecuteNonQuery("Update T_ZanCai set CaiCount=CaiCount+1");
int caiCount=(int)SqlHelper.ExecuteScalar("select top 1 CaiCount from T_ZanCai");
context.Response.Write(caiCount);
}
4、封装Ajax请求。不用写那么一堆。可以封装Ajax库。
添加文件夹,建立JS文件。
------------------------------------------ajax.js
function ajax(data,onsuccess){
//onsuccess是指向function的变量,类似于C#委托,data是指向一个字符串
function ajax(url,onsuccess){//先假定onsuceess就只有一个参数,就是一个返回的报文。
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject
('Microsoft.XMLHTTP');
xmlhttp.open("POST", "url", true);
xmlhttp.onreadystatechange = function (){
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200)
{
//onsuccess();//处理成功后的逻辑是变的。
//document.getElementById("ZanCount").innerHTML = xmlhttp.responseText;
onsuccess(xmlhttp.responseText);
//假定onsuceess就只有一个参数,就是一个返回的报文。则可以这样写,直接把报文传过去
。
}
else
{
alert("AJAX服务器返回错误!");
}
}
}
xmlhttp.send();
}
}
5、做Cai的Ajax-----------------------------------ViewVideo2.htm
<script type="text/javascript" src="js/ajax.js">//路径为什么不../js/ajax.js
</script>
function cai()
{
ajax("ZanCai.ashx?action=Cai",function(resText){
document.getElementById("CaiCount").innerHTML=resText;});//为什么不../ZanCai.ashx?
}
----------------------<input type="button" name="Cai" value="踩" onclick="cai()">
6、5中的路径问题,为什么不同的文件夹,调用的时候没有..呢?
<video src="diaosi.mp4" autoplay controls></video>//给我我这个文件夹下的diaosi.mp4