2013年12月18日水曜日

【ASP.NET WebForms】別のページにポストするFormの作成

通常のhttp通信はブラウザからのRequestとサーバからのResponseで成り立っています。
ASP.NET WebForms では、自ページにポストし(PostBack)受け取ったデータを処理して、必要があれば別のページに遷移するというのが基本的な設計になっています。

別ページに直接ポストするのが結構困難で、runat="server"のformはページ内に1つしか記述できないとか、runat="server"でないformを記述したとしてもASP.NETが自動で吐き出すformと入れ子になってしまって上手く挙動しないなどのトラブルにみまわれます。

自サイト内だけで処理が完結するのであれば、PostBackを基本とした設計にするなどの解決方法も取れるかもしれませんが、他サイトとの連携などが絡むと何らかの手段を講じる必要があります。


1つにはSystem.Net.WebClientクラスやSystem.Net.WebRequestクラスを利用して他サイトと通信する方法があります。
この場合Responseがサーバに返ってきますので、サーバでその後の処理を行ってあげる必要があります。
URLも上図サーバAのURLとなります。


BtoBなんかでもありますが、データを直接他サーバにポストしてしまって、その後の処理も他サーバに預けてしまいたいという要件の場合があります。
ASP.NET MVC 等であれば、出力されるhtmlは細かくハンドリングできるので他サーバに直接ポストするhtmlを記述することができます。(セキュリティの問題などをクリアする必要はあるかと思いますが)
前述のようにASP.NET WebFormsでは自動で出力されるhtmlが邪魔で少しテクニックが必要です。

ここではjavascriptを使って直接ポストする方法をご紹介します。
以下のようなコードをボタンClickイベントなどに記述いたします。


        //javascriptで自動でポストされるhtmlフォームを作成する
        StringBuilder html = new StringBuilder();
        html.AppendLine("<html>");
        html.AppendLine(@"<body onload='document.forms[""formid""].submit()'>");
        html.AppendLine(String.Format("<form action='{0}' id='formid' method='POST'>", ServerBUrl));
        html.AppendLine(String.Format("<input name='name1' type='hidden' value='{0}' />", somethingValue));
        html.AppendLine("</form>");
        html.AppendLine("</body>");
        html.AppendLine("</html>");
        
        //作成したhtmlフォームをResponseとして返す
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Write(html.ToString());
        HttpContext.Current.Response.End();


以上メモまで。

2013年12月8日日曜日

【PC環境】コタツ、座椅子、ワイヤレスキーボード、ワイヤレストラックボールマウスの組み合わせが最高!

普段PCを利用するのは書斎の普通の机と椅子の環境ですが、
家族で使うリビングのPCはコタツでTVをモニターがわりにしています。
今まではクッションに座って使ってましたが、前屈みになるので腰に負担がかかり
もう少し良い環境にならないかなーと思っていました。

そして購入したのがこれ「KUMO(和楽の雲)」という座椅子です。


タイプはKUMO上、PU(ポリウレタン)のブラウンです。



おっと、失礼

早速コタツにセットしてみます。


私の身長は174cm、体重は68kgです。
普通に腰掛ける 浅めに腰掛ける 深めに腰掛ける
ご覧の通り深めに腰掛けた時は首を支えることはできません。
浅めに座った時に腰が痛くなるという意見もあるそうですが、
私は気になりませんし、クッションを入れるなどして軽減できると思います。



さて、コタツに座椅子という快適な組み合わせが整いましたが、
この通り卓上のキーボードやマウスの操作が不便です。


・・・


ここで活躍するのがワイヤレスキーボードとマウスです。
特にマウスはトラックボールマウス(M570)がオススメです。


このように膝の上でマウスもキーボードも操作可能です。


これからの寒い冬コタツで快適生活!

2013年12月4日水曜日

【LINQ to XML】名前空間の記述でエラー

LINQ to XML でXMLを操作する際に
「System.Xml.XmlException: ':' 文字、16 進数値 0x3A を名前に含むことはできません。」
というエラーが吐出されて困ったのでメモ。

エラーになったのは以下のようなコード(C#)

var xml = new XElement("Root", "Root Value", 
              new XAttribute("xml:lang","ja"));

コードとエラーを見て頂ければ分かると思いますが、
「:」を属性名で使ってはいけないということです。
(要素名にも使ってはいけません)
 「xml:lang」の「xml」の部分は名前空間として記述しなくてはなりません。

以下が修正したコードです。

var xml = new XElement("Root", "Root Value", 
              new XAttribute(XNamespace.Xml + "lang","ja"));

これで以下のようなXMLが作成されます
Root Value 


(参考)
XNamespaceクラス
http://msdn.microsoft.com/ja-jp/library/system.xml.linq.xnamespace(v=vs.110).aspx