へっぽこSE改めTranslator m-tanakaの日記 このページをアンテナに追加 RSSフィード

2007-05-09

[]ASP.NET Mobile ControlでFormにutn属性をつける ASP.NET Mobile ControlでFormにutn属性をつけるを含むブックマーク

DoCoMo携帯電話の端末IDを取得するには、formやaタグにutnという属性をつける必要がある

(http://www.limy.org/program/mobile/uid.html)

しかし、Mobile ControlのFormはutn属性の出力に対応していないので、これを出力できるCHTML用のDevice Adapterを作ってみる

public class CHTMLUtnFormAdapter :ChtmlFormAdapter
{
	public override void Render(HtmlMobileTextWriter writer)
	{
		if(base.Control.CustomAttributes["utn"] == null)
		{
			base.Render(writer);
			return;
		}

		try
		{
			StringBuilder   sb = new StringBuilder ();

			StringWriter    swr = new StringWriter (sb);

			HtmlMobileTextWriter hwr = (HtmlMobileTextWriter)
				writer.GetType().
				GetConstructor(new Type[]{writer.GetType(),typeof(MobileCapabilities)}).
				Invoke(new object[]{swr,HttpContext.Current.Request.Browser});

			base.Render (hwr);
			string html = sb.ToString ();

			Regex formRegex = new Regex("<form\\s+id=\"" + Control.ClientID + "\"",RegexOptions.Compiled);

html = formRegex.Replace(html,"
writer.Write (html); } catch(NullReferenceException e) { base.Render(writer); } } }

ChtmlFormAdapterのソースは結構複雑なので、これに手を入れることはあきらめ、

出力内容を一旦StringBuilderにためておき、正規表現でformの開始タグマッチさせ、

utn属性を付加しています

使用方法は、

STEP1 PageのAllowCustomAttributesをtrueに設定する

STEP2 Web.configで、FormとAdapterを関連付ける

<mobileControls cookielessDataDictionaryType="System.Web.Mobile.CookielessData">
	<device name="exHTMLDeviceAdapters" inheritsFrom="ChtmlDeviceAdapters">				
		<control name="System.Web.UI.MobileControls.Form" 

adapter="Hogenamespace.CHTMLUtnFormAdapter,HogeAssembly"/> </device> </mobileControls>

STEP3 FormにutnのCustomAttributeをつける

(値はなんでもよい)

<mobile:Form id="Form1" runat="server" utn="utn">

[]mobile:TextBox に istyle 属性を追加する mobile:TextBox に istyle 属性を追加するを含むブックマーク

From よさだやぐぶろぐ

http://osada.bz/PermaLink.aspx?guid=3daf911f-347a-4efa-9728-8e8ebc5598d2

DeviceSpecific でも CustomAttributes でも、同じようにセットした accesskey はいけるのに、istyle 属性勝手に消される。AccessKey とかってやってみても、accesskey ってなるんだよね。どうも裏でチェックしてるっぽい。

MobileCapabilities で SupportsInputIStyle って取れるんだけど、使えなきゃ意味ねぇよな全く。結局独自でコントロールを作るしかないらしい。

ChtmlTextBoxAdapterが、TextBoxのnumericプロパティがTrueの時に、istyle=4を出力しているだけで、

CustomAttributesでistyleを設定しても無視されている模様

なので、istyleをサポートしたAdapterを作ってみた

public class IStyleSupportTextBoxAdapter : ChtmlTextBoxAdapter 
{
	protected override void AddAttributes(HtmlMobileTextWriter writer)
	{
		base.AddAttributes(writer);
		TextBox tbox = (TextBox) base.Control;
		string istyle = (string)tbox.CustomAttributes["istyle"];
		if(istyle !=null)
		{
			writer.WriteAttribute("istyle", istyle);
		}
	}
}

[]ASP.NET Mobile Control でStyleを一元管理する ASP.NET Mobile Control でStyleを一元管理するを含むブックマーク

http://msdn2.microsoft.com/ja-jp/library/6854a8as(VS.80).aspx

外部スタイル シートの実装
外部スタイル シートを実装するには、次の 3 つの操作が必要です。 

1. .ascx ファイルMicrosoft ASP.NET ユーザー コントロールを記述します。

2. .ascx ファイルスタイル シートを 1 つ配置し、必要な Style 要素を追加します。

3. スタイル シートを宣言し、次に、その ReferencePath プロパティに、外部スタイル シートを使用する各モバイル ページ用のユーザー コントロールの .ascx ファイル名を設定します。

実行時に、外部スタイル シートに宣言したすべてのスタイルが、モバイル ページのスタイル シート用の ASP.NET ページ フレームワークで使用できるようになります。

少し補足

3.はascxではなく、スタイルを参照するaspxに対しての設定

また、ここで使用するascxにはStyleSheet以外のコントロールを含めないほうが無難

Panel等が含まれていると

型 Panel の ID _ctl0:pnlHeader を持つコントロールは、フォーム内に含まれなければなりません。 

となってしまう

(StyleSheetはFormの外側に配置しなければならないが、その他のコントロールはFormの内側に配置しなければならないため、と思われる)

トラックバック - http://d.hatena.ne.jp/m-tanaka/20070509