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ということですね。