|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。asp.net|服务器|控件Introduction
在webapplication的表单提交过程当中显现“pleasewait”信息大概是gif动绘图片一般是很有效的,出格是提交历程对照久的情形。我比来开辟了一个查询拜访提交程序,在程序里外部用户经由过程一个网页上传excel电子表格。程序将上传的电子表格数据拔出到数据库中。这个历程只必要几秒钟,但即使是几秒钟,在网页是看来倒是十分分明的守候历程。在程序测试的时分,一些用户反复地址击上传按钮。因而,供应一个视觉的信息来告知人们上传正在举行中是很有效的。并同时把上传按钮一同埋没失落,以避免屡次点击。这里先容的控件是Button控件的子类,它演示了怎样把客户端javascript代码封装在asp.net服务器控件中来供应便当的功效。
固然表面已有良多javascript的例子来完成这件事变,但当我试图把这些功效封装到asp.net控件中时我发明了一些成绩。我最入手下手实验经由过程javascript的onclick句柄来使button有效,并用别的的文本代替。但我发明很辣手,如许会妨害到asp.net服务器真个click事务的功效。而终极行得通的,而且对分歧扫瞄器也有很好撑持的办法是,让button在div标志中出现。div能够埋没而且无妨碍asp.net的click事务。
Usingthecontrol
作为一般的button控件的派生,PleaseWaitButton的功效与它基础一样。它经由过程三个附加的属性来办理当按钮被点击后"pleaseWait"信息或图片的显现。
PleaseWaitText
这是显现的客户端文本信息,假如存在,当按钮被点击它将代替按钮。
PleaseWaitImage
这是显现的图象文件(好比gif动绘图像),假如存在,当按钮被点击它将代替按钮。这个属性将酿成"
,_pleaseWaitImage,_pleaseWaitText)
:String.Empty);
//establishthelayoutbasedonPleaseWaitType
switch(_pleaseWaitType)
{
casePleaseWaitTypeEnum.TextThenImage:
sMessage=sText+sImage;
break;
casePleaseWaitTypeEnum.ImageThenText:
sMessage=sImage+sText;
break;
casePleaseWaitTypeEnum.TextOnly:
sMessage=sText;
break;
casePleaseWaitTypeEnum.ImageOnly:
sMessage=sImage;
break;
}
//returnthefinalcodechunk
stringsCode=string.Format(
"PleaseWait(pleaseWaitButtonDiv_{0},
pleaseWaitButtonDiv2_{1},{2});"
,this.ClientID,this.ClientID,sMessage);
sCode=sCode.Replace(""",""");
returnsCode;
}
假如指定了一个PleaseWaitImage,就必需包括分外的一段Javascript代码来关照客户端预载该图象。这段剧本的注册应当呈现在重写的OnPreRender办法中。注册的键是图象的称号;假如多个按钮都利用统一图象,预载剧本只必要实行一次。这里利用了一个正则表达式来创立Javascript图象变量,以包管特别字字符(好比文件路径中的斜线)转化成下划线。
protectedoverridevoidOnPreRender(EventArgse)
{
base.OnPreRender(e);
//Ifwereusinganimage,registersomejavascript
//forclient-sideimagepreloading
if(_pleaseWaitImage!=String.Empty
&&_pleaseWaitType!=PleaseWaitTypeEnum.TextOnly)
RegisterJavascriptPreloadImage(_pleaseWaitImage);
}
privatevoidRegisterJavascriptPreloadImage(stringsImage)
{
Regexrex=newRegex("[^a-zA-Z0-9]");
stringsImgName="img_"+rex.Replace(sImage,"_");
StringBuildersb=newStringBuilder();
sb.Append("<scriptlanguage=JavaScript>");
sb.Append("if(document.images){");
sb.AppendFormat("{0}=newImage();",sImgName);
sb.AppendFormat("{0}.src="{1}";",sImgName,sImage);
sb.Append("}");
sb.Append("</script>");
this.Page.RegisterClientScriptBlock(sImgName+"_PreloadScript",
sb.ToString());
}
Client-sidefunctions
嵌进的文本文件javascript.txt包括了埋没按钮的<div>和显现"pleasewait"信息或图象的客户端代码。这些代码在重写的OnInit()办法中挪用的公有办法RegisterJavascriptFromResource()加载。这个办法挪用泛型办法GetEmbeddedTextFile(),在这个泛型办法中把文件做为源加载而把内容前往成字符串。
protectedoverridevoidOnInit(EventArgse)
{
base.OnInit(e);
//theclient-sidejavascriptcodeiskept
//inanembeddedresource;loadthescript
//andregisteritwiththepage.
RegisterJavascriptFromResource();
}
privatevoidRegisterJavascriptFromResource()
{
//loadtheembeddedtextfile"javascript.txt"
//andregisteritscontentsasclient-sidescript
stringsScript=GetEmbeddedTextFile("javascript.txt");
this.Page.RegisterClientScriptBlock("PleaseWaitButtonScript",sScript);
}
privatestringGetEmbeddedTextFile(stringsTextFile)
{
//genericfunctionforretrievingthecontents
//ofanembeddedtextfileresourceasastring
//wellgettheexecutingassembly,andderive
//thenamespaceusingthefirsttypeintheassembly
Assemblya=Assembly.GetExecutingAssembly();
StringsNamespace=a.GetTypes()[0].Namespace;
//withtheassemblyandnamespace,wellgetthe
//embeddedresourceasastream
Streams=a.GetManifestResourceStream(
string.Format("{0}.{1}",sNamespace,sTextFile)
);
//readthecontentsofthestreamintoastring
StreamReadersr=newStreamReader(s);
StringsContents=sr.ReadToEnd();
sr.Close();
s.Close();
returnsContents;
}
javascript.txt嵌进资本包括了按钮在Javascript的onclick句柄中实行的客户端办法PleaseWait()。这段代码也挪用了一个客户端办法HideDiv()以埋没按钮的容器<div>,然后经由过程设置innerHTML属性把信息或图象组装进之前空的<div>标志中。帮助函数GetDiv()则是经由过程反省document.getElementById,document.all,和document.layers用id前往一个<div>工具,包管了分歧扫瞄器的兼容性。上面是javascript.txt的全体代码:
<scriptlanguage="JavaScript">
functionGetDiv(sDiv)
{
vardiv;
if(document.getElementById)
div=document.getElementById(sDiv);
elseif(document.all)
div=eval("window."+sDiv);
elseif(document.layers)
div=document.layers[sDiv];
else
div=null;
returndiv;
}
functionHideDiv(sDiv)
{
d=GetDiv(sDiv);
if(d)
{
if(document.layers)d.visibility="hide";
elsed.style.visibility="hidden";
}
}
functionPleaseWait(sDivButton,sDivMessage,sInnerHtml)
{
HideDiv(sDivButton);
vard=GetDiv(sDivMessage);
if(d)d.innerHTML=sInnerHtml;
}
</script>
原文链接:http://www.codeproject.com/aspnet/PleaseWaitButton.asp
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。 |
|