Microsoft ASP.NET AJAX v1.0 Beta
Microsoft ASP.NET AJAX CTP Beta
ASP.NET AJAX Control Toolkit
まだ、弄くる時間も無いですが、もうそこまできているのですね。
楽しみです。
Microsoft ASP.NET AJAX v1.0 Beta
Microsoft ASP.NET AJAX CTP Beta
ASP.NET AJAX Control Toolkit
まだ、弄くる時間も無いですが、もうそこまできているのですね。
楽しみです。
カスタムコントロールのプロパティの型をコントロールにしたい時に必要なTypeConverterの抽象クラスです。
各、コントロール毎にTypeConverterを一から作るのはめんどくさいので、抽象クラスを作っておいて、継承先で型を指定するプロパティをオーバライドする事で指定の型のTypeConverterを作成しています。
001 using System; 002 using System.Drawing; 003 using System.Reflection; 004 using System.Collections; 005 using System.ComponentModel; 006 using System.ComponentModel.Design; 007 using System.ComponentModel.Design.Serialization; 008 namespace NAL6295.Web.UI.Controls 009 { 010 /// <summary> 011 /// コントロールのリストと選択されたコントロールの文字列を相互変換するコンバータの抽象クラス 012 /// </summary> 013 public abstract class ControlConverterAbstract:System.ComponentModel.StringConverter 014 { 015 016 /// <summary> 017 /// 選択リストに追加したいコントロールの型情報 018 /// </summary> 019 protected abstract System.Type ControlType{get;} 020 021 022 023 /// <summary> 024 /// 値リストのサポートを許可する 025 /// </summary> 026 /// <param name="context"></param> 027 /// <returns></returns> 028 public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) 029 { 030 return true; 031 } 032 033 /// <summary> 034 /// 値リストの作成 035 /// </summary> 036 /// <param name="context"></param> 037 /// <returns>デザイン画面に存在するControlTypeプロパティで指定されたコントロールのリストを取得しそのIDリストを返す</returns> 038 public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) 039 { 040 ArrayList selectionList = new ArrayList(); 041 042 foreach(System.Web.UI.Control item in GetControlList(context)) 043 { 044 selectionList.Add(item.ID); 045 } 046 047 return new System.ComponentModel.TypeConverter.StandardValuesCollection(selectionList); 048 } 049 050 /// <summary> 051 /// 文字列型から指定された型への変換 052 /// 選択リストに無い文字列が指定されていたときは、String.Emptyを返す 053 /// </summary> 054 /// <param name="context"></param> 055 /// <param name="culture"></param> 056 /// <param name="value"></param> 057 /// <returns></returns> 058 public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 059 { 060 if(value is string) 061 { 062 foreach(System.Web.UI.Control item in GetControlList(context)) 063 { 064 if(item.ID == (string)value) 065 { 066 return base.ConvertFrom(context, culture, value); 067 } 068 } 069 return string.Empty; 070 } 071 return base.ConvertFrom(context, culture, value); 072 } 073 074 /// <summary> 075 /// 指定された型のリストを返す 076 /// </summary> 077 /// <param name="context"></param> 078 /// <returns></returns> 079 private object[] GetControlList(ITypeDescriptorContext context) 080 { 081 IReferenceService service = (IReferenceService)context.GetService(typeof(IReferenceService)); 082 return service.GetReferences(ControlType); 083 } 084 085 086 } 087 088 } 089 090
使用例
001 public sealed class TextBoxConverter:ControlConverterAbstract 002 { 003 protected override Type ControlType 004 { 005 get 006 { 007 return typeof(TextBox); 008 } 009 } 010 011 }
URLに日本語を利用していて、
URLEncodeしてwebフォームにアクセスしても、
そのままだとレンダリングされたformタグのaction属性が、
デコードされたURLになっている。
そのため、ポストバック時にアクセスするURLはEncodeされていない。
それを回避するにはglobal.asaxのPreRequestHandlerExecuteイベント内で、
下記のコードを記述すればよい。
System.Web.HttpContext.Current.RewritePath(System.Web.HttpContext.Current.Request.Url.AbsolutePath);
実際はそのイベントじゃなくても、ある程度許容範囲がある。
RequestEndイベント内でもOKだった。
■[ASP.NET][.NET Tips]改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法
■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法
NAL-6295の舌先三寸 – つまらない事の中に重要な事がある。
というエントリで公開していたソースでは
テキスト部分をクリックすると最後のラジオボタンが選択される。
以前に(といっても1ヶ月前)この記事で改訂版を出していましたが、下記の制限がありました。
・プログラム側でcheckedの内容を変更すると、
次のポストバックのLoadViewState時にcheckedの内容が変更されて、
クライアントで選択されたcheckedの内容を取得できなかった。
(EnabledViewState=falseでも)
そこで、下記の改訂版を出すことにしました。
Group化する場合のみ、ViewStateを無視する仕様になっています。
001 Imports System.ComponentModel 002 Imports System.Web.UI 003 004 005 <DefaultProperty("Checked"), ToolboxData("<{0}:RadioButtonEx runat=server></{0}:RadioButtonEx>")> _ 006 Public Class RadioButtonEx 007 Inherits System.Web.UI.WebControls.RadioButton 008 009 Public Overrides ReadOnly Property UniqueID() As String 010 Get 011 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 012 Return MyBase.UniqueID 013 Else 014 Return Me.GroupName() 015 End If 016 End Get 017 End Property 018 019 Public Overrides ReadOnly Property ClientID() As String 020 Get 021 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 022 Return MyBase.ClientID 023 Else 024 Return MyBase.UniqueID 025 End If 026 End Get 027 End Property 028 029 Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs) 030 Me.Attributes.Add("value", MyBase.UniqueID) 031 MyBase.OnPreRender(e) 032 End Sub 033 034 Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 035 MyBase.OnInit(e) 036 If Me.Page.IsPostBack Then 037 Me.Checked = MyBase.UniqueID = Me.Page.Request.Form.Item(Me.GroupName) 038 End If 039 End Sub 040 041 042 Protected Overrides Sub LoadViewState(ByVal savedState As Object) 043 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 044 MyBase.LoadViewState(savedState) 045 End If 046 End Sub 047 048 Protected Overrides Function SaveViewState() As Object 049 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 050 Return MyBase.SaveViewState() 051 Else 052 Return Nothing 053 End If 054 End Function 055 End Class 056
既に
http://d.hatena.ne.jp/NAL-6295/20060726
にて再度改訂済みです。
■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法
というエントリで公開していたソースでは
テキスト部分をクリックすると最後のラジオボタンが選択される。
という問題がありました。
それを解決したソースを以下に公開しておきます。
説明をすると、
ClientIDをオーバライドして、GroupNameプロパティが設定されているときのみMyBase.UniqueIDを返す処理
を追加しました。
001 Imports System.ComponentModel 002 Imports System.Web.UI 003 004 005 <DefaultProperty("Checked"), ToolboxData("<{0}:RadioButtonEx runat=server></{0}:RadioButtonEx>")> _ 006 Public Class RadioButtonEx 007 Inherits System.Web.UI.WebControls.RadioButton 008 009 Public Overrides ReadOnly Property UniqueID() As String 010 Get 011 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 012 Return MyBase.UniqueID 013 Else 014 Return Me.GroupName() 015 End If 016 End Get 017 End Property 018 019 Public Overrides ReadOnly Property ClientID() As String 020 Get 021 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 022 Return MyBase.ClientID 023 Else 024 Return MyBase.UniqueID 025 End If 026 End Get 027 End Property 028 029 Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs) 030 Me.Attributes.Add("value", MyBase.UniqueID) 031 MyBase.OnPreRender(e) 032 End Sub 033 034 Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 035 MyBase.OnInit(e) 036 If Me.Page.IsPostBack Then 037 Me.Checked = MyBase.UniqueID = Me.Page.Request.Form.Item(Me.GroupName) 038 End If 039 End Sub 040 End Class 041
当分ASP.NET1.1で仕事する事になりそうなので、
Ajax.NETを再び検証する必要があるというわけで、
メモ代わりに貼っておこう。
http://ajax.schwarz-interactive.de/csharpsample/default.aspx
近い将来使うのでメモ
要約 : IIS では、クライアント証明書による認証がサポートされています。ここでは、アクセス時にクライアント証明書が必要になるように Web アプリケーションを構成する方法を述べます。さらに、クライアント コンピュータ上に証明書をインストールして、Web アプリケーションの呼び出し時に証明書を使用する方法も示します。
注意:
http://d.hatena.ne.jp/NAL-6295/20060726
にて再度改訂済みです
表題の通りですが、
RadioButtonコントロールを継承して、以下のコードを書くと
グループ化できるし、ポストバック時にCheckedプロパティも
正常に動作します。
というエントリで掲載したサンプルは、デザイン時に描画エラーが出てしまう問題が発生していました。(勿論、実行時には使える)
そこで、今回、その制限を回避することが可能になりましたので、新しくサンプルを公開します。
過去に、先のエントリを参照された方は、こちらに置き換えると良いかもしれません。
001 Imports System.ComponentModel 002 Imports System.Web.UI 003 004 005 <DefaultProperty("Checked"), ToolboxData("<{0}:RadioButtonEx runat=server></{0}:RadioButtonEx>")> _ 006 Public Class RadioButtonEx 007 Inherits System.Web.UI.WebControls.RadioButton 008 009 Public Overrides ReadOnly Property UniqueID() As String 010 Get 011 If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then 012 Return MyBase.UniqueID 013 Else 014 Return Me.GroupName() 015 End If 016 End Get 017 End Property 018 019 Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs) 020 Me.Attributes.Add("value", MyBase.UniqueID) 021 MyBase.OnPreRender(e) 022 End Sub 023 024 Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 025 MyBase.OnInit(e) 026 If Me.Page.IsPostBack Then 027 Me.Checked = MyBase.UniqueID = Me.Page.Request.Form.Item(Me.GroupName) 028 End If 029 End Sub 030 End Class 031 032
ASP.NET2.0ではアプリケーションのルートにApp_Offline.htmファイルを置くだけで、
そちらの内容が表示されるようになる。
ユーザはそちらの内容しか見る事ができないので、その間に、ファイルの置き換え、バッチ等を行う事が可能になる。
どんどん便利になるなあ。
ASP.NET 2.0にはそういった一時停止のための機能がつくようです。
それもApp_Offline.htmというファイルを置くだけ。
一時停止中にアクセスしてきたユーザにはApp_Offline.htmの内容が送られる、ということは何時まで停止の予定です、と書いておけばOKということですね。