我来做百科(第七天)
今天先把会员的部分做了吧。主要是“我的贡献”和“我的评论”,两个列表。
先是“我的贡献”,给内容添加一个根据会员查找方法就是了。
![](/images/cnblogs_com/cloudgamer/20080124t8t8t8g.gif)
至于“我的评论”,也是给评论添加一个根据会员查找方法,差不多。
![](/images/cnblogs_com/cloudgamer/20080124t5t5t58t8t8g.gif)
接着先整理一下代码吧。先是给“退出”写一个控件,在LinkButton的OnClick事件里添加退出功能和跳转功能。还有一个问题困扰我很久的,就是怎么防止重复提交。对于刷新重复提交那种我都是提交成功后直接Redirect页面,还有另一种比较麻烦的是网络延迟造成的多次点击提交。开始我是在按钮控件OnClientClick上disabled掉按钮,到发现这样提交后不会执行按钮的OnClick事件,于是到处问,终于在csdn那里找到答案,laogui327 告诉我这样:
Button1.Attributes.Add("onclick", "this.value='正在提交中,请等待……';this.disabled=true;" + this.GetPostBackEventReference(Button1));
太好了,终于找到在按钮本身就能解决的方法,感谢!
于是根据这个写了个只能提交一次的控件:
public class ButtonSubmitOnce : Button
{
private string _textonclick = "正在提交中,请等待……";
![](/Images/OutliningIndicators/InBlock.gif)
protected override void Render(HtmlTextWriter writer)
{
this.OnClientClick += "this.value=\"" + _textonclick + "\";this.disabled = true;" + Page.GetPostBackEventReference(this);
![](/Images/OutliningIndicators/InBlock.gif)
base.Render(writer);
}
![](/Images/OutliningIndicators/InBlock.gif)
public string TextOnClick
{
set { _textonclick = value; }
}
}
不知有没有其他办法,但这是我找到最好的了。
立即在发表评论那里用一下,ok!放一个验证控件吧,但问题来了,验证的程序居然会放到自己定义的代码后面,即:
<input type="submit" name="ctl00$cphContent$btnAdd" value=" 添 加 " onclick="this.value="正在提交中,请等待……";this.disabled = true;__doPostBack('ctl00$cphContent$btnAdd','');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphContent$btnAdd", "", true, "", "", false, false))" id="ctl00_cphContent_btnAdd" class="btn" />
Faint!搞了一阵,也不知道怎么能把自定义的OnClientClick放得更后一点了,郁闷。看来验证控件不能用了,还有我还有js,不气馁。于是在自定义的ButtonSubmitOnce上再添加一点东西:
/// <summary>
/// 只能提交一次的按钮
/// </summary>
public class ButtonSubmitOnce : Button
{
private string _textonclick = "正在提交中,请等待……";
private string _clientcheck;
![](/Images/OutliningIndicators/InBlock.gif)
protected override void Render(HtmlTextWriter writer)
{
StringBuilder temp = new StringBuilder();
![](/Images/OutliningIndicators/InBlock.gif)
temp.Append(this.OnClientClick);
if (!string.IsNullOrEmpty(_clientcheck)) temp.Append("if(!").Append(_clientcheck).Append(") return false;");
temp.Append("this.value=\"").Append(_textonclick).Append("\";this.disabled = true;").Append(Page.GetPostBackEventReference(this));
this.OnClientClick = temp.ToString();
![](/Images/OutliningIndicators/InBlock.gif)
base.Render(writer);
}
![](/Images/OutliningIndicators/InBlock.gif)
public string TextOnClick
{
set { _textonclick = value; }
}
![](/Images/OutliningIndicators/InBlock.gif)
public string ClientCheck
{
set { _clientcheck = value; }
}
}
这样给ClientCheck赋一个返回bool的检测js函数就可以了。
但为什么提交这么一点东西会这么慢啊,带着疑问打开源码一看,一大串的VIEWSTATE,怪不得。怪不得老赵某篇文章中说不用VIEWSTATE啦,我也要试一下。这一页会用到VIEWSTATE的地方就是发表评论嘛,因为会在后台检测数据,有错的话会回到原来那页显示出错信息。像以前asp那样用一个alert和history.back()就可以了嘛。一切准备就绪,在ie测试,没问题,不错嘛,在ff测试,出问题了。页面后退后按钮仍然是disabled状态,这怎么办啊。难道要放弃其中一个?搞了很久没搞好,之后又用回VIEWSTATE,痛苦,崩溃,谁好心告诉我怎么搞啊。
还有一个问题是多个提交按钮时设置默认提交按钮的问题。我问了一下,有人告诉我解决方法是:
<asp:TextBox ID="TextBox1" runat="server" onkeydown="if(event.keyCode==13){document.getElementById('Button1').click();}"></asp:TextBox>
在onkeydown中处理,但这样视觉上还是有问题,因为onfocus会有一个视觉效果的,所以想能不能用onfocus解决。我想了个方法,原理是当textbox取得焦点,立即给button焦点,再把焦点返回给textbox。貌似可以,试一下,发现不行,原来实际上是一个死循环。郁闷了一下,看来还是用大伙的方法吧。试了一下还是不行,因为enter的时候虽然是执行了onkeydown的程序,但同时默认的提交也触发了。痛苦,崩溃,谁好心告诉我怎么搞啊。
一轮折磨之后,还是先休息一下啦。
先是“我的贡献”,给内容添加一个根据会员查找方法就是了。
![](/images/cnblogs_com/cloudgamer/20080124t8t8t8g.gif)
至于“我的评论”,也是给评论添加一个根据会员查找方法,差不多。
![](/images/cnblogs_com/cloudgamer/20080124t5t5t58t8t8g.gif)
接着先整理一下代码吧。先是给“退出”写一个控件,在LinkButton的OnClick事件里添加退出功能和跳转功能。还有一个问题困扰我很久的,就是怎么防止重复提交。对于刷新重复提交那种我都是提交成功后直接Redirect页面,还有另一种比较麻烦的是网络延迟造成的多次点击提交。开始我是在按钮控件OnClientClick上disabled掉按钮,到发现这样提交后不会执行按钮的OnClick事件,于是到处问,终于在csdn那里找到答案,laogui327 告诉我这样:
![](/Images/OutliningIndicators/None.gif)
太好了,终于找到在按钮本身就能解决的方法,感谢!
于是根据这个写了个只能提交一次的控件:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
不知有没有其他办法,但这是我找到最好的了。
立即在发表评论那里用一下,ok!放一个验证控件吧,但问题来了,验证的程序居然会放到自己定义的代码后面,即:
![](/Images/OutliningIndicators/None.gif)
Faint!搞了一阵,也不知道怎么能把自定义的OnClientClick放得更后一点了,郁闷。看来验证控件不能用了,还有我还有js,不气馁。于是在自定义的ButtonSubmitOnce上再添加一点东西:
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这样给ClientCheck赋一个返回bool的检测js函数就可以了。
但为什么提交这么一点东西会这么慢啊,带着疑问打开源码一看,一大串的VIEWSTATE,怪不得。怪不得老赵某篇文章中说不用VIEWSTATE啦,我也要试一下。这一页会用到VIEWSTATE的地方就是发表评论嘛,因为会在后台检测数据,有错的话会回到原来那页显示出错信息。像以前asp那样用一个alert和history.back()就可以了嘛。一切准备就绪,在ie测试,没问题,不错嘛,在ff测试,出问题了。页面后退后按钮仍然是disabled状态,这怎么办啊。难道要放弃其中一个?搞了很久没搞好,之后又用回VIEWSTATE,痛苦,崩溃,谁好心告诉我怎么搞啊。
还有一个问题是多个提交按钮时设置默认提交按钮的问题。我问了一下,有人告诉我解决方法是:
![](/Images/OutliningIndicators/None.gif)
一轮折磨之后,还是先休息一下啦。
转载请注明出处:http://www.cnblogs.com/cloudgamer/
如有任何建议或疑问,欢迎留言讨论。
如果觉得文章不错的话,欢迎点一下右下角的推荐。
程序中包含的js工具库CJL.0.1.min.js,原文在这里。