这篇post写好后发现在博客园不能保存,原因是内容包含违禁内容。
只有写到其他地方,再挂个链接了。
http://spaces.huash.com/index.php/uid-133969-action-viewspace-itemid-240537
另外说一下,用了用感觉Discuz/ X-Space 真是个不错的博客、圈子软件,希望雪人和他同事们的DisuczNT做的更好。
----------------------------------------------------------------------------------------------------------
注:
此post不接受任何其他IDC评论,不接受其对其他IDC的推荐。
任何评论中出现任何IDC网站相关链接都将被删除。
本人有权认定您的评论是否是枪手文章或广告内容。
评论前请看右边的公告,谢谢合作!
----------------------------------------------------------------------------------------------------------
在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉
Asp.Net2.0中新增了ICallbackEventHandler接口,用于指示控件可以作为服务器的回调事件的目标。
MSDN中的描述:
实现 ICallbackEventHandler 接口的控件的示例包括 GridView、DetailsView 和 TreeView 控件。当回调事件以实现了 ICallbackEventHandler 接口的控件为目标时,将把事件变量作为参数传递来调用 RaiseCallbackEvent 方法以处理该事件,并且GetCallbackResult 方法返回回调的结果。
ICallbackEventHandler成员有:
如下代码实现一个不经过回发而实现客户端回掉的CheckBox
。
//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.AspxBoy.com"><br />// Copyright (c) www.AspxBoy.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />/// A Asynchronous AutoPostback Checkbox Control<br />/// </summary><br />[DefaultEvent("CheckedChanged")]<br />[ControlValueProperty("Checked")]<br />[DefaultProperty("Text")]<br />public class AsynchronousCheckBox : WebControl, INamingContainer, ICallbackEventHandler<br />{<br />#region Delegates<br />/// <summary><br />/// The delegate for the checked changed event<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />public delegate void CheckedChangedEventHander(object sender, CheckChangedEventArgs e);<br />#endregion<br />#region Events<br />private static readonly object eventCheckedChanged;<br />/// <summary><br />/// The checked changed event.<br />/// </summary><br />public event CheckedChangedEventHander CheckedChanged<br />{<br />add<br />{<br />Events.AddHandler(eventCheckedChanged, value);<br />}<br />remove<br />{<br />Events.RemoveHandler(eventCheckedChanged, value);<br />}<br />}<br />#endregion<br />#region Constructors<br />/// <summary><br />/// Static Constructor<br />/// </summary><br />static AsynchronousCheckBox()<br />{<br />eventCheckedChanged = new object();<br />}<br />/// <summary><br />/// Constructor<br />/// </summary><br />public AsynchronousCheckBox()<br />: base(HtmlTextWriterTag.Input)<br />{<br />}<br />#endregion<br />#region Properties<br />/// <summary><br />/// Gets or sets a value indicating whether the Lable Text<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Lable Text")]<br />public virtual string Text<br />{<br />get<br />{<br />return (string)ViewState["Text"];<br />}<br />set<br />{<br />this.ViewState["Text"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the 'Client CallBack Script Name'<br />/// </summary><br />[Description("Gets or sets a value indicating whether the 'Client CallBack Script function Name'")]<br />public string ClientCallBackScript<br />{<br />get<br />{<br />object o = ViewState["ClientCallBackScript"];<br />return o == null ? "null" : o.ToString();<br />}<br />set<br />{<br />ViewState["ClientCallBackScript"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the checkbox 's checked<br />/// </summary><br />[Description("Gets or sets a value indicating whether the checkbox 's checked")]<br />public bool Checked<br />{<br />get<br />{<br />object o = ViewState["Checked"];<br />return o == null ? false : (bool)o;<br />}<br />set<br />{<br />ViewState["Checked"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Text 's cssClass<br />/// </summary><br />[Description("Gets or sets a value indicating whether the Text 's cssClass")]<br />public string TextCss<br />{<br />get<br />{<br />return (string)ViewState["TextCss"];<br />}<br />set<br />{<br />ViewState["TextCss"] = value;<br />}<br />}<br />/// <summary><br />/// Gets or sets a value indicating whether the Label 's position<br />/// </summary><br />public virtual TextAlign TextAlign<br />{<br />get<br />{<br />object o = ViewState["TextAlign"];<br />if (o != null)<br />{<br />return (TextAlign)o;<br />}<br />return TextAlign.Right;<br />}<br />set<br />{<br />if ((value <textalign.left) || (value > TextAlign.Right))<br />{<br />throw new ArgumentOutOfRangeException("value");<br />}<br />ViewState["TextAlign"] = value;<br />}<br />}<br />#endregion<br />#region Render Meghods<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void Render(HtmlTextWriter writer)<br />{<br />if (TextAlign == TextAlign.Left)<br />{<br />RenderLabel(writer);<br />base.Render(writer);<br />}<br />else<br />{<br />base.Render(writer);<br />RenderLabel(writer);<br />}<br />}<br />/// <summary><br />/// Render Label<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />private void RenderLabel(HtmlTextWriter writer)<br />{<br />if (string.IsNullOrEmpty(Text))<br />{<br />return;<br />}<br />writer.Write("<label");<br />writer.WriteAttribute("for", ClientID);<br />if (!string.IsNullOrEmpty(TextCss))<br />{<br />writer.WriteAttribute("class", TextCss);<br />}<br />writer.Write(">");<br />writer.Write(Text);<br />writer.WriteEndTag("label");<br />}<br />/// <summary><br />/// Override the AddAttributesToRender method<br />/// </summary><br />///<br /><span name="writer" class="mceItemParam"></span></param><br />protected override void AddAttributesToRender(HtmlTextWriter writer)<br />{<br />if (base.Page == null)<br />{<br />base.Page.VerifyRenderingInServerForm(this);<br />}<br />string callbackReference<br />= Page.ClientScript.GetCallbackEventReference(this, "this.checked", ClientCallBackScript, null);<br />writer.AddAttribute(HtmlTextWriterAttribute.Onclick, callbackReference);<br />writer.AddAttribute(HtmlTextWriterAttribute.Type, "checkbox");<br />if (Checked)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Checked, "checked");<br />}<br />if (!Enabled)<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");<br />}<br />if (!string.IsNullOrEmpty(ToolTip))<br />{<br />writer.AddAttribute(HtmlTextWriterAttribute.Title, ToolTip);<br />}<br />base.AddAttributesToRender(writer);<br />}<br />#endregion<br />#region On Checked Changed<br />/// <summary><br />/// Invoke the check changed event.<br />/// </summary><br />///<br /><span name="sender" class="mceItemParam"></span></param><br />///<br /><span name="e" class="mceItemParam"></span></param><br />protected virtual void OnCheckedChanged(object sender, CheckChangedEventArgs e)<br />{<br />CheckedChangedEventHander hander = Events[eventCheckedChanged] as CheckedChangedEventHander;<br />if (hander != null)<br />{<br />Checked = e.Checked;<br />hander(this, e);<br />}<br />}<br />#endregion<br />#region ICallbackEventHandler Members<br />/// <summary><br />/// Get the result of a client side callback.<br />/// </summary><br />/// <returns>The callback result string.</returns><br />public string GetCallbackResult()<br />{<br />return Checked.ToString();<br />}<br />/// <summary><br />/// Raise the client callback event<br />/// </summary><br />///<br /><span name="eventArgument" class="mceItemParam"></span>The event arguments.</param><br />public void RaiseCallbackEvent(string eventArgument)<br />{<br />bool isChecked = Boolean.Parse(eventArgument);<br />CheckChangedEventArgs args = new CheckChangedEventArgs(isChecked);<br />OnCheckedChanged(this, args);<br />}<br />#endregion<br />}<br />}<br />//------------------------------------------------------------------------------<br />// <copyright company="Meibo Wu www.AspxBoy.com"><br />// Copyright (c) www.AspxBoy.com All rights reserved.<br />// </copyright><br />//------------------------------------------------------------------------------<br />using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />namespace HBZ<br />{<br />/// <summary><br />///<br />/// </summary><br />public class CheckChangedEventArgs:EventArgs<br />{<br />/// <summary><br />///<br />/// </summary><br />///<br /><span name="_isChecked" class="mceItemParam"></span></param><br />public CheckChangedEventArgs(bool _isChecked)<br />{<br />isChecked = _isChecked;<br />}<br />private bool isChecked = false;<br />/// <summary><br />///<br />/// </summary><br />public bool Checked<br />{<br />get<br />{<br />return isChecked;<br />}<br />}<br />}<br />}<br />
http://www.aspxboy.com/private/5504/default.aspx
自己也是搞.net开发的,经常看到有些朋友在csdn发求职/招聘贴
国内而现有的大招聘网站又未见专门为我们这拨人有个专门分类。就花了点时间做了这样一个网站。
今天开始试运行。
希望为.Net开发人员和企业提供一个良好的求职招聘平台!
.Net专业人力资源网

欢迎大家提出意见和建议
http://www.dotnetjobs.cn/FeedBack.aspx
试验了一下给BlogEngine生成10000个post 程序第一次运行时等待的时间让我想自杀(白屏了近2分钟)
看了一下代码,发现BlogEngine在第一次运行时候加载所有Post(从数据库)到List内,类似(Early initialization)
当新添加post时,给数据库(xml/database)内加入该post同时给List内追加该post
删除一个post时候从数据库(xml/database)内删除并从List内remove该post
1
2private string _Content;
3/**//// <summary>
4/// Gets or sets the Content or the post.
5/// </summary> 6public string Content
7{
8 get
9 {
10 if ( _Content == null )
11 {
12 _Content = LoadPostContent( this.Id );
13 }
14 return _Content;
15 }
16 set
17 {
18 if ( _Content != value )
19 MarkDirty( "Content" );
20 _Content = value;
21 }
22}
23private string LoadPostContent(Guid id)
24{
25 string content = null;
26
27 string key = string.Format("Be:Content:{0}",id);
28
29 // if there is no content cached
30 object obj = HttpContext.Current.Cache.Get(key);
31 if(obj == null)
32 {
33 // load the post's content from provider here
34 content = BlogService.LoadPostContent( id );
35
36 HttpContext.Current.Cache.Insert(key, content, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
37
38 // if use xml store the data
39 // 更丑陋点的 new CacheDependency(_Folder + "posts\\" + id.ToString() + ".xml") in the Cache.Insert Method
40 }
41
42}
43
44private static object _SyncRoot = new object();
45private static List<Post> _Posts;
46/**//// <summary>
47/// A sorted collection of all posts in the blog.
48/// Sorted by date.
49/// </summary> 50public static List<Post> Posts
51{
52 get
53 {
54 lock (_SyncRoot)
55 {
56
if (_Posts == null)
57
{
58 //in provider the 'FillPosts' method' dose not return the 'real' content' per post;
59
60
_Posts = BlogService.FillPosts( );
61 }
62 return _Posts;
63 }
64 }
65}
66
67in XmlBlogProvider
68
69/**//// <summary>
70
/// Retrieves a post based on the specified Id.
71
/// </summary> 72
public override Post SelectPost(Guid id)
73

{
74
string fileName = _Folder + "posts\\" + id.ToString() + ".xml";
75
Post post = new Post();
76
XmlDocument doc = new XmlDocument();
77
doc.Load(fileName);
78
79
post.Title = doc.SelectSingleNode("post/title").InnerText;
80
post.Description = doc.SelectSingleNode("post/description").InnerText;
81
82
post.Content = null; // dose not return the 'real' content'
83
84
post.DateCreated = DateTime.Parse(doc.SelectSingleNode("post/pubDate").InnerText);
85
post.DateModified = DateTime.Parse(doc.SelectSingleNode("post/lastModified").InnerText);
86
87
// setting other filed
88
89
return post;
90
}
91
Post class in Business object layer
92
93
private string _Content;
94
/**//// <summary>
95
/// Gets or sets the Content or the post.
96
/// </summary> 97
public string Content
98

{
99
get
100
{
101
if ( _Content == null )
102
{
103
_Content = LoadPostContent( this.Id );
104
}
105
return _Content;
106
}
107
set
108
{
109
if ( _Content != value )
110
MarkDirty( "Content" );
111
_Content = value;
112
}
113
}
114
private string LoadPostContent(Guid id)
115

{
116
string key = string.Format("Be:Content:{0}",id);
117
string content = null;
118
// if there is no content cached by id
119
object obj = HttpContext.Current.Cache.Get(key);
120
if(obj == null)
121
{
122
// load the post's content from provider here
123
content = BlogService.LoadPostContent( id );
124
125
HttpContext.Current.Cache.Insert(key, content, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero);
126
127
// if use xml store the data
128
// we can use a CacheDependency like new CacheDependency(_Folder + "posts\\" + id.ToString() + ".xml") in the Cache.Insert Method
129
130
return content;
131
}
132
return (strong)obj;
133
134
}
135
136
private static object _SyncRoot = new object();
137
private static List<Post> _Posts;
138
/**//// <summary>
139/// A sorted collection of all posts in the blog.
140/// Sorted by date.
141/// </summary>142public static List<Post> Posts
143{
144 get
145 {
146 lock (_SyncRoot)
147 {
148 if (_Posts == null)
149 {
150 //in provider the 'FillPosts' method' dose not return the 'real' content' per post;
151
152 _Posts = BlogService.FillPosts( );
153 }
154 return _Posts;
155 }
156 }
157}
158
159in XmlBlogProvider
160
161/**//// <summary>
162/// Retrieves a post based on the specified Id.
163/// </summary>164public override Post SelectPost(Guid id)
165{
166 string fileName = _Folder + "posts\\" + id.ToString() + ".xml";
167 Post post = new Post();
168 XmlDocument doc = new XmlDocument();
169 doc.Load(fileName);
170
171 post.Title = doc.SelectSingleNode("post/title").InnerText;
172 post.Description = doc.SelectSingleNode("post/description").InnerText;
173
174 post.Content = null; // dose not return the 'real' content'
175
176 post.DateCreated = DateTime.Parse(doc.SelectSingleNode("post/pubDate").InnerText);
177 post.DateModified = DateTime.Parse(doc.SelectSingleNode("post/lastModified").InnerText);
178
179 // setting other fileds
180
181 return post;
182} 个人觉得 是否应该对于Content、Comment这种占用大量内存的字段是否该采用类似Lazy Initialization 的方式
说明:第一次加载所有post时候 post list内的item不带真实的comtent和comment等
然后在用到的时候再从数据库读取,然后放入缓存,下次备用
这样Posts内的item都变的瘦多了,类似于延迟初始化(Lazy Initialization )
请大家讨论讨论,谢谢!