バージョンは1.1:カスタムコントロールのプロパティの型をコントロールにしたい時に必要なTypeConverterの抽象クラス

カスタムコントロールのプロパティの型をコントロールにしたい時に必要な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     }

Share

URLEncodeしたページにアクセスした後、ポストバックする時はURLEncodeされていないURLでアクセスしてしまうのを回避する(検証はASP.NET1.1)

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だった。

Share

再改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法(ターゲットはASP.NET1.1です。)

■[ASP.NET][.NET Tips]改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法

■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法

NAL-6295の舌先三寸 – つまらない事の中に重要な事がある。

というエントリで公開していたソースでは

テキスト部分をクリックすると最後のラジオボタンが選択される。

NAL-6295の舌先三寸 – 改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法

以前に(といっても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 

Share

改訂版:DataGrid内のラジオボタンでグループに出来ない問題の回避方法

既に

http://d.hatena.ne.jp/NAL-6295/20060726

にて再度改訂済みです。

■[ASP.NET][.NET Tips]過去のサンプルの修正DataGrid内のラジオボタンでグループに出来ない問題の回避方法

NAL-6295の舌先三寸 – つまらない事の中に重要な事がある。

というエントリで公開していたソースでは

テキスト部分をクリックすると最後のラジオボタンが選択される。

という問題がありました。

それを解決したソースを以下に公開しておきます。

説明をすると、

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 

Share

クライアント認証を利用したASP.NETアプリケーションの構築

近い将来使うのでメモ

要約 : IIS では、クライアント証明書による認証がサポートされています。ここでは、アクセス時にクライアント証明書が必要になるように Web アプリケーションを構成する方法を述べます。さらに、クライアント コンピュータ上に証明書をインストールして、Web アプリケーションの呼び出し時に証明書を使用する方法も示します。

セキュリティ保護された ASP.NET アプリケーションの構築 : クライアント証明書のセットアップ方法

Share

過去のサンプルの修正(DataGrid内のラジオボタンでグループに出来ない問題の回避方法)

注意:

http://d.hatena.ne.jp/NAL-6295/20060726

にて再度改訂済みです

表題の通りですが、

RadioButtonコントロールを継承して、以下のコードを書くと

グループ化できるし、ポストバック時にCheckedプロパティも

正常に動作します。

NAL-6295の舌先三寸 – DataGrid内のラジオボタンでグループに出来ない問題の回避方法

というエントリで掲載したサンプルは、デザイン時に描画エラーが出てしまう問題が発生していました。(勿論、実行時には使える)

そこで、今回、その制限を回避することが可能になりましたので、新しくサンプルを公開します。

過去に、先のエントリを参照された方は、こちらに置き換えると良いかもしれません。

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 

Share

ASP.NET2.0ではアプリケーションの一時停止が楽になる

ASP.NET2.0ではアプリケーションのルートにApp_Offline.htmファイルを置くだけで、

そちらの内容が表示されるようになる。

ユーザはそちらの内容しか見る事ができないので、その間に、ファイルの置き換え、バッチ等を行う事が可能になる。

どんどん便利になるなあ。

ASP.NET 2.0にはそういった一時停止のための機能がつくようです。

それもApp_Offline.htmというファイルを置くだけ。

一時停止中にアクセスしてきたユーザにはApp_Offline.htmの内容が送られる、ということは何時まで停止の予定です、と書いておけばOKということですね。

どっとねっとふぁんBlog : ASP.NET 2.0でのアプリケーションの一時停止

Share

SessionのInProcモード

何も知らないで運用で使っている人が沢山いそうだ。

そして、知らないから原因不明だと思いこむ不具合に遭遇していそう。

そんな私も初めてASP.NETにさわった時はそんな状態でした。

Share