おぼえがき・その2 †今更だけど.Net Framework2.0 ケータイでみれないぉ!(・∀・) †自分でサイト作るとこういうとこがもう…ね… <%if%> PC用 <%else%> ケータイ用 <%endif%> …きっとこれじゃ(マイクロソフトのvisualなんたら製品で)デザイナ画面が見れない。 ケータイでみれないぉ!(・∀・)その2 †便利ツール(頭の中にだけあるケータイ向け便利スクリプト)を考えてみよう。 便利でもないツールをつくってみた。 †参考はココ
トップページ.aspxでUserAgent判別 ↓ ↓ (PC) (ケータイ) そのまま表示 ケータイ.aspx(便利ツールのつもり)へリダイレクト ↓ テキストファイル(XML)を読み込んでHTMLへ変換(XSL)してShiftJisで出力
<%@ Page Language="C#" ・・・%> <script runat="server"> public string mobfile = "ケータイ.aspx"; </script> <!--#include file="判別用スクリプト.inc"--> <!DOCTYPE ・・・・> <html ・・・> とりあえずトップページだけでも対応するってことで <script runat="server"> private readonly static string[] MobileUserAgentList = new string[]{ "(DoCoMo){1}", "(UP.Browser){1}", "(J-PHONE){1}", "(Vodafone){1}", "(SoftBank){1}" }; protected bool isMobile(string[] agentInfo) { foreach (string usr in agentInfo) { foreach (string exp in MobileUserAgentList) { if (Regex.IsMatch(usr, exp)) { return true; } } } return false; } protected new void Page_Load(object sender, System.EventArgs e) { string[] agentInfo = HttpContext.Current.Request.UserAgent.Split('/'); if (agentInfo.Length == 0) { } else { if (isMobile(agentInfo)) { Server.Transfer(mobfile); } } } </script> 作りやすいのでこの判別スクリプトもaspxファイルにしてたけど <%@ Page Language="C#" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Text" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Xml.Xsl" %> <%@ Import Namespace="System.Xml.XPath" %> <script runat="server"> //------------------------------------------------ //PageLoadでなくPage_PreRenderってところがミソらしい //------------------------------------------------ protected void Page_PreRender(object sender, System.EventArgs e) { //-------------------------- //XML(テキスト)をXSLでhtmlに変換 //-------------------------- // ファイルを取得するには相対パスじゃだめらしい。 string xfpath = Context.Server.MapPath("~/データディレクトリ"); string xspath = Context.Server.MapPath("~/xslが置いてあるディレクトリ"); string xmlfile = xfpath + "/データ.xml"; string xslfile = xspath + "/スタイル.xsl"; //XMLを読み込む XmlDocument myXMLDoc = new XmlDocument(); myXMLDoc.Load(xmlfile); //XSLTを変換用に読み込む XslCompiledTransform transformer = new XslCompiledTransform(); transformer.Load(xslfile); //読み込んだXMLのリーダーを生成 XmlNodeReader reader = new XmlNodeReader(myXMLDoc); //変換するためのメモリ領域生成 MemoryStream xs = new MemoryStream(); //変換するためのライター生成 // * ちなみにxmlもxslもShift-Jisで作ったが // * ここのエンコードはデフォ(UniCode?UTF-8?で。) XmlTextWriter xw = new XmlTextWriter(xs, null); //いざ!変換。リーダーをライターへ。 transformer.Transform(reader, xw); //------------------------ //Responseするための準備 //------------------------ //変換した中身を読み込む xs.Seek(0, SeekOrigin.Begin); StreamReader xr = new StreamReader(xs); string outXhtm = xr.ReadToEnd(); xs.Dispose(); //Reasponseライター生成。ここでエンコードをShift−Jisへ。 Encoding enc = Encoding.GetEncoding("shift_jis"); Stream stream = Response.OutputStream; StreamWriter writer = new System.IO.StreamWriter(stream, enc); writer.Write(outXhtm); writer.Flush(); } </script> 中身はこんだけ。 リダイレクト無しで・・・ †というわけで、記事部分をXMLで、XSLはHTMLにするために通す。 <%@ Page ・・・ %> <script runat="server"> public string myXmlpath = "~/データディレクトリ"; public string myXslpath = "~/xslの置いてあるディレクトリ"; public string myXml = "/記事.xml"; public string myXsl = "/ケータイ用変換.xsl"; </script> <!--#include file="判別用スクリプト.inc"--> <!--#include file="ケータイ.inc"--> <!DOCTYPE html ・・・> <html xmlns="http://www.w3.org/1999/xhtml" > : (以下通常ページの記述)
protected void myPage_PreRender(object sender, System.EventArgs e) { : ファイルパス取得のところを書き換え。 //-------------------------- //XML(テキスト)をXSLでhtmlに変換 //-------------------------- // ファイルを取得するには相対パスじゃだめらしい string xfpath = Context.Server.MapPath(myXmlpath); string xspath = Context.Server.MapPath(myXslpath); string xmlfile = xfpath + myXml; string xslfile = xspath + myXsl;
this.Response.HeaderEncoding = enc; this.Response.ContentType = "text/html; charset=Shift_JIS"; this.Response.Flush(); this.Response.End(); レスポンス終了! protected new void Page_Load(object sender, System.EventArgs e) { : if (isMobile(agentInfo)) { //Server.Transfer(mobfile); myPage_PreRender(sender, e); } : }
Masterファイルを使っていたので・・・ †aspxの各ページはMasterファイル使ってデザインを統一している。 <script runat="server"> : protected new void Page_PreRender(object sender, System.EventArgs e) { string[] agentInfo = HttpContext.Current.Request.UserAgent.Split('/'); if (agentInfo.Length == 0) { } else { if (isMobile(agentInfo)) { myPage_PreRender(sender, e); } } } </script> …元々Page_PreRender?でやるべきところだったんだもんな〜 Masterファイルを使っていたので・・・(その2) †MasterType?使ってmasterにオーバーライドしてるaspxで巧く変換されないぉ!(・∀・) protected string myXmlpath = "~/データディレクトリ"; protected string myXslpath = "~/xslの置いてあるディレクトリ"; protected string myXml = "/記事.xml"; protected string myXsl = "/ケータイ用変換.xsl"; public string MobXmlPath { get{return myXmlpath;} set{myXmlpath = value;} } : (以下同じようにオナジ用に宣言) …面倒なのでこれも別ファイル化。(ケータイ用変数.inc) masterにinclude <%@ Master ・・・ %> <%@ Import namespase="System.Web.UI.WebControls" %> : (import部分) : <script runat="server"> // Masterのweb.ui.contorolに対して上書きするためのアクセサ public string テキストラベル { get { return this.Label1.Text; } set { this.Label1.Text = value; } } : </script> <!--#include file="ケータイ用変数.inc"--> <!--#include file="判別用スクリプト.inc"--> <!--#include file="ケータイ.inc"--> <script runat="server"> // MasterのPage_Load処理(通常=PC表示時の処理) protected new void Page_Load(object sender, System.EventArgs e) { : } </script> <!DOCTYPE html ・・・> <html xmlns="http://www.w3.org/1999/xhtml" > : (以下通常masterページの記述) このmasterを使うaspxの記述 <%@ Page … %> <%@ MasterType … %> <script runat="server"> protected new void Page_Load(object sender, System.EventArgs e) { Master.MobXmlpath = "~/App_Data/x_heavnsdoor"; Master.MobXslpath = "~/x_heavnsdoor/css"; Master.MobXml = "/description.xml"; Master.MobXsl = "/m_x_heavns.xsl"; // 通常(=PC)用の変数もセット Master.テキストラベル = "PC用の変えたいテキストはココ"; : } </script> : (以下通常ページの記述) これでなんかスッキリ(・∀・) aspxのLoad→masterのLoad→ なんじゃないかと。しかしこの先は…(´・ω・) (続く)
EOF |