Asp.Netカスタムコントロールシリーズ(一)
11663 ワード
最近、会社のあるサイトでカスタムコントロールが使われているのを見て、どうやって一目で見ても、何が分からないのか、
ネットで検索すると、確かにいくつかの言葉で強力なカスタムコントロールが書けるわけではないようです.では、私たちとして、基本学からカスタムコントロール学習プロセスシリーズを書くことにしました.
もちろん、私はこのシリーズを勉強しているだけで、マスターとしてチュートリアルを書くわけではありません.
もしあなたが自分がmasterだと思ったら、問題を指摘することを歓迎します.
もしあなたが自分が大菜鳥だと思ったら、交流を勉強してください.
このシリーズは主にwebサーバのカスタムコントロールを学びます.
Webサーバのコントロールはいくつかあります.
HTMLサーバコントロール、
ASP.NET標準サーバーコントロール
カスタムサーバコントロール:これが私が勉強したい、書きたいポイントです.
どんなことを勉强しても、まずマイクロソフトの公式から勉强しなければならないと思います.たぶん知识を知ってから、ネットで他のブログの文章を见たりします.一人一人の理解が违ったり、人に理解されたりしますが、作者が本当に言いたいことを完全に表现していません.误解されたら、損をしているわけではありません.だから、マイクロソフトから勉强してから、他の文章を见て、もっと正確に知ることができます
もちろん基礎的な勉強から、マイクロソフトの公式がどう言っているかを見てみましょう.
http://msdn.microsoft.com/zh-cn/library/yhzc935f(v=vs.100).aspx
見終わったら、この手順に従って簡単なカスタムコントロールを作成すると信じています.少なくとも1つのLabelの出力内容を変えるのは問題ありません.もし私たちがログインしたカスタムコントロールを書きたいなら、最初の編を見た後、手がつけられないことを示していますか?はい、私は見終わった後、とても仕方がないと言って、大丈夫で、一歩一歩来て、後で私たちはこの知識を学びます.
マイクロソフトの公式の実例を見てから、いくつかのことが重要だと思います.繰り返して強調することができます.
コードにはいくつかの特性があります.
BindableAttribute . このプロパティは、プロパティをデータにバインドすることがビジュアル化デザイナに意味があるかどうかを指定します.たとえば、Visual StudioでBindable(true)とマークされている場合は、データバインドダイアログボックスに表示されます.属性がこの特性タグを使用していない場合、属性ブラウザはその値をBindable(false)と推定します.
CategoryAttribute . このプロパティは、ビジュアルデザイナーのプロパティブラウザでプロパティを分類する方法を指定します.たとえば、ページ開発者がプロパティブラウザの分類ビューを使用すると、Category(「Appearance」)はプロパティブラウザに「外観」カテゴリにプロパティを表示するように通知します.プロパティブラウザの既存のカテゴリに対応する文字列パラメータを指定したり、独自のカテゴリを作成したりできます.
DescriptionAttribute . このプロパティは、プロパティの簡単な説明を指定します.Visual Studioでは、プロパティブラウザに選択したプロパティの説明が「プロパティ」ウィンドウの下部に表示されます.<これはコントロール属性では見られませんが、どこが間違っているのか分かりません>.
DefaultValueAttribute . このプロパティは、プロパティのデフォルト値を指定します.この値は、プロパティ・アクセサ(getter)から返されるデフォルト値と同じです.Visual Studioで、DefaultValueAttributeプロパティを使用すると、ページ開発者は「プロパティ」ウィンドウにショートカットメニューを表示し、「リセット」ボタンをクリックしてプロパティ値をデフォルト値にリセットできます.
LocalizableAttribute . このプロパティは、ビジュアルデザイナーにローカライズされたプロパティが意味を持つかどうかを指定します.ビジュアル化デザイナは、属性がLocalizable(true)とマークされている場合、属性をリソースにシーケンス化するときにその属性値を含みます.コントロールに対してローカライズ可能なプロパティをポーリングすると、デザイナはこのプロパティ値を地域固有のリソースファイルまたは別のローカライズソースに保存します.
ViewState:
両方のプロパティに使用されるGetメソッドとSetメソッドは、ViewStateオブジェクトを使用します.ViewStateオブジェクトは、WebControlクラスに組み込まれたヘルプオブジェクトです.開発の観点から、ViewStateは、再送中に保持したい任意の属性を格納するための集合クラスと見なすことができる.実際には、ViewStateは、Cookie、セッションなどを使用して永続性を実行する方法を決定するために必要なすべてのコードと論理をカプセル化しています.
protected override void RenderContents(HtmlTextWriter writer),
ここではコントロールに設計されたライフサイクルです.コントロールライフサイクルのRenderフェーズでは、主にコントロールタグと文字テキストをサーバーコントロール出力ストリームに出力する.Htmlタグを直接書くこともできるし、各コントロールにあるRenderControlメソッドを出力ストリームに呼び出すこともできる.WebControlベースクラスでは、Renderで始まるレンダリング方法は次のとおりです.
以上のRenderメソッドでは、何の関係もないわけではない、それらの実行順序は上から下へであり、ネストされた呼び出し関係がある.ここで、RenderControlメソッドの内部ではRenderメソッドが呼び出され、Renderメソッドの内部ではRenderBeginTag、RenderContents、RenderEndTagが順次呼び出される.ここで、RenderControlとRenderは、WebControl自体もControlを継承するため、Controlベースクラスにおけるメソッドである.基本的なコントロールを開発するには、RenderContentsメソッドを書き換えるだけでよいが、このメソッドでは、コントロールHtmlのテキストタグや他のコンテンツを出力ストリームに書き込むことができる.
また、RenderBeginTagとRenderEndTagの2つの方法がリロード可能である、この2つの方法の実行時点は、それぞれRenderコントロールの内容の前後である.この2つの方法の自己定義コントロールの開始フラグと終了フラグを書き換えることができる.デフォルトでは、コントロールはをコントロールの開始と終了フラグとして使用します.次に、タグを書き換えていない例のデフォルト表示を示します.
ここではまずこの理論知識を見て、後で実践しましょう.
この章の学習を通じて、Webへのプロセス全体を作成し、導入する方法を知りました.残りは、より強力なカスタムコントロールをどのようにするかです.
私はウェブページの中のLabelを、反射を通じてソースコードを見つけて、私たちに参考にして、私たちは自分でコントロールを編纂して、実は多くありません
ここにはいいページがあります.見終わったら、もっと収穫してほしいです.
http://blog.csdn.net/huang7914/article/details/2329261
ネットで検索すると、確かにいくつかの言葉で強力なカスタムコントロールが書けるわけではないようです.では、私たちとして、基本学からカスタムコントロール学習プロセスシリーズを書くことにしました.
もちろん、私はこのシリーズを勉強しているだけで、マスターとしてチュートリアルを書くわけではありません.
もしあなたが自分がmasterだと思ったら、問題を指摘することを歓迎します.
もしあなたが自分が大菜鳥だと思ったら、交流を勉強してください.
このシリーズは主にwebサーバのカスタムコントロールを学びます.
Webサーバのコントロールはいくつかあります.
HTMLサーバコントロール、
ASP.NET標準サーバーコントロール
カスタムサーバコントロール:これが私が勉強したい、書きたいポイントです.
どんなことを勉强しても、まずマイクロソフトの公式から勉强しなければならないと思います.たぶん知识を知ってから、ネットで他のブログの文章を见たりします.一人一人の理解が违ったり、人に理解されたりしますが、作者が本当に言いたいことを完全に表现していません.误解されたら、損をしているわけではありません.だから、マイクロソフトから勉强してから、他の文章を见て、もっと正確に知ることができます
もちろん基礎的な勉強から、マイクロソフトの公式がどう言っているかを見てみましょう.
http://msdn.microsoft.com/zh-cn/library/yhzc935f(v=vs.100).aspx
見終わったら、この手順に従って簡単なカスタムコントロールを作成すると信じています.少なくとも1つのLabelの出力内容を変えるのは問題ありません.もし私たちがログインしたカスタムコントロールを書きたいなら、最初の編を見た後、手がつけられないことを示していますか?はい、私は見終わった後、とても仕方がないと言って、大丈夫で、一歩一歩来て、後で私たちはこの知識を学びます.
マイクロソフトの公式の実例を見てから、いくつかのことが重要だと思います.繰り返して強調することができます.
コードにはいくつかの特性があります.
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The text to display when the user is not logged in."),
Localizable(true)
]
public virtual string DefaultUserName
{
get
{
string s = (string)ViewState["DefaultUserName"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["DefaultUserName"] = value;
}
}
BindableAttribute . このプロパティは、プロパティをデータにバインドすることがビジュアル化デザイナに意味があるかどうかを指定します.たとえば、Visual StudioでBindable(true)とマークされている場合は、データバインドダイアログボックスに表示されます.属性がこの特性タグを使用していない場合、属性ブラウザはその値をBindable(false)と推定します.
CategoryAttribute . このプロパティは、ビジュアルデザイナーのプロパティブラウザでプロパティを分類する方法を指定します.たとえば、ページ開発者がプロパティブラウザの分類ビューを使用すると、Category(「Appearance」)はプロパティブラウザに「外観」カテゴリにプロパティを表示するように通知します.プロパティブラウザの既存のカテゴリに対応する文字列パラメータを指定したり、独自のカテゴリを作成したりできます.
DescriptionAttribute . このプロパティは、プロパティの簡単な説明を指定します.Visual Studioでは、プロパティブラウザに選択したプロパティの説明が「プロパティ」ウィンドウの下部に表示されます.<これはコントロール属性では見られませんが、どこが間違っているのか分かりません>.
DefaultValueAttribute . このプロパティは、プロパティのデフォルト値を指定します.この値は、プロパティ・アクセサ(getter)から返されるデフォルト値と同じです.Visual Studioで、DefaultValueAttributeプロパティを使用すると、ページ開発者は「プロパティ」ウィンドウにショートカットメニューを表示し、「リセット」ボタンをクリックしてプロパティ値をデフォルト値にリセットできます.
LocalizableAttribute . このプロパティは、ビジュアルデザイナーにローカライズされたプロパティが意味を持つかどうかを指定します.ビジュアル化デザイナは、属性がLocalizable(true)とマークされている場合、属性をリソースにシーケンス化するときにその属性値を含みます.コントロールに対してローカライズ可能なプロパティをポーリングすると、デザイナはこのプロパティ値を地域固有のリソースファイルまたは別のローカライズソースに保存します.
ViewState:
両方のプロパティに使用されるGetメソッドとSetメソッドは、ViewStateオブジェクトを使用します.ViewStateオブジェクトは、WebControlクラスに組み込まれたヘルプオブジェクトです.開発の観点から、ViewStateは、再送中に保持したい任意の属性を格納するための集合クラスと見なすことができる.実際には、ViewStateは、Cookie、セッションなどを使用して永続性を実行する方法を決定するために必要なすべてのコードと論理をカプセル化しています.
protected override void RenderContents(HtmlTextWriter writer),
ここではコントロールに設計されたライフサイクルです.コントロールライフサイクルのRenderフェーズでは、主にコントロールタグと文字テキストをサーバーコントロール出力ストリームに出力する.Htmlタグを直接書くこともできるし、各コントロールにあるRenderControlメソッドを出力ストリームに呼び出すこともできる.WebControlベースクラスでは、Renderで始まるレンダリング方法は次のとおりです.
RenderControl(HtmlTextWriter writer)
Render(HtmlTextWriter writer)
RenderBeginTag(HtmlTextWriter writer)
RenderContents(HtmlTextWriter output)
RenderEndTag(HtmlTextWriter writer)
以上のRenderメソッドでは、何の関係もないわけではない、それらの実行順序は上から下へであり、ネストされた呼び出し関係がある.ここで、RenderControlメソッドの内部ではRenderメソッドが呼び出され、Renderメソッドの内部ではRenderBeginTag、RenderContents、RenderEndTagが順次呼び出される.ここで、RenderControlとRenderは、WebControl自体もControlを継承するため、Controlベースクラスにおけるメソッドである.基本的なコントロールを開発するには、RenderContentsメソッドを書き換えるだけでよいが、このメソッドでは、コントロールHtmlのテキストタグや他のコンテンツを出力ストリームに書き込むことができる.
また、RenderBeginTagとRenderEndTagの2つの方法がリロード可能である、この2つの方法の実行時点は、それぞれRenderコントロールの内容の前後である.この2つの方法の自己定義コントロールの開始フラグと終了フラグを書き換えることができる.デフォルトでは、コントロールはをコントロールの開始と終了フラグとして使用します.次に、タグを書き換えていない例のデフォルト表示を示します.
ここではまずこの理論知識を見て、後で実践しましょう.
この章の学習を通じて、Webへのプロセス全体を作成し、導入する方法を知りました.残りは、より強力なカスタムコントロールをどのようにするかです.
私はウェブページの中のLabelを、反射を通じてソースコードを見つけて、私たちに参考にして、私たちは自分でコントロールを編纂して、実は多くありません
// Generated by .NET Reflector from C:\windows\Microsoft.Net\assembly\GAC_64\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll
namespace System.Web.UI.WebControls
{
using System;
using System.ComponentModel;
using System.Runtime;
using System.Web;
using System.Web.UI;
using System.Web.Util;
[Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxData("<{0}:Label runat=\"server\" Text=\"Label\"></{0}:Label>"), DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ParseChildren(false), ControlValueProperty("Text"), ControlBuilder(typeof(LabelControlBuilder)), DefaultProperty("Text")]
public class Label : WebControl, ITextControl
{
private bool _textSetByAddParsedSubObject;
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public Label()
{
}
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
internal Label(HtmlTextWriterTag tag) : base(tag)
{
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
string associatedControlID = this.AssociatedControlID;
if (associatedControlID.Length != 0)
{
if (this.AssociatedControlInControlTree)
{
Control control = this.FindControl(associatedControlID);
if (control == null)
{
if (!base.DesignMode)
{
throw new HttpException(SR.GetString("LabelForNotFound", new object[] { associatedControlID, this.ID }));
}
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.For, control.ClientID);
}
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.For, associatedControlID);
}
}
base.AddAttributesToRender(writer);
}
protected override void AddParsedSubObject(object obj)
{
if (this.HasControls())
{
base.AddParsedSubObject(obj);
}
else if (obj is LiteralControl)
{
if (this._textSetByAddParsedSubObject)
{
this.Text = this.Text + ((LiteralControl) obj).Text;
}
else
{
this.Text = ((LiteralControl) obj).Text;
}
this._textSetByAddParsedSubObject = true;
}
else
{
string text = this.Text;
if (text.Length != 0)
{
this.Text = string.Empty;
base.AddParsedSubObject(new LiteralControl(text));
}
base.AddParsedSubObject(obj);
}
}
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
base.LoadViewState(savedState);
if ((((string) this.ViewState["Text"]) != null) && this.HasControls())
{
this.Controls.Clear();
}
}
}
protected internal override void RenderContents(HtmlTextWriter writer)
{
if (base.HasRenderingData())
{
base.RenderContents(writer);
}
else
{
writer.Write(this.Text);
}
}
[Themeable(false), WebSysDescription("Label_AssociatedControlID"), DefaultValue(""), IDReferenceProperty, TypeConverter(typeof(AssociatedControlConverter)), WebCategory("Accessibility")]
public virtual string AssociatedControlID
{
get
{
string str = (string) this.ViewState["AssociatedControlID"];
if (str != null)
{
return str;
}
return string.Empty;
}
set
{
this.ViewState["AssociatedControlID"] = value;
}
}
internal bool AssociatedControlInControlTree
{
get
{
object obj2 = this.ViewState["AssociatedControlNotInControlTree"];
if (obj2 != null)
{
return (bool) obj2;
}
return true;
}
set
{
this.ViewState["AssociatedControlNotInControlTree"] = value;
}
}
internal override bool RequiresLegacyRendering
{
get
{
return true;
}
}
public override bool SupportsDisabledAttribute
{
get
{
return (this.RenderingCompatibility < VersionUtil.Framework40);
}
}
protected override HtmlTextWriterTag TagKey
{
get
{
if (this.AssociatedControlID.Length != 0)
{
return HtmlTextWriterTag.Label;
}
return base.TagKey;
}
}
[Localizable(true), PersistenceMode(PersistenceMode.InnerDefaultProperty), Bindable(true), WebCategory("Appearance"), DefaultValue(""), WebSysDescription("Label_Text")]
public virtual string Text
{
get
{
object obj2 = this.ViewState["Text"];
if (obj2 != null)
{
return (string) obj2;
}
return string.Empty;
}
set
{
if (this.HasControls())
{
this.Controls.Clear();
}
this.ViewState["Text"] = value;
}
}
}
}
ここにはいいページがあります.見終わったら、もっと収穫してほしいです.
http://blog.csdn.net/huang7914/article/details/2329261