TextBox の MaxLength が効かない

ASP.NET の TextBox における MaxLength

TextBox の MaxLength プロパティは、TextMode が MultiLine になっていると動作しないというバグが存在する。しかもこれは .NET Framework 4.5 になっても修正されていない。

JavaScript でゴリゴリ対処する

やや泥臭いが、これに関しては JavaScript で回避するしかない。

テキストボックス
<asp:TextBox ID="TextBox1" runat="server" Rows="5" TextMode="MultiLine" keypress="return CheckLength();" onblur="TrimValue();"></asp:TextBox>
JavaScript
// keypress イベントにセットする関数。
var maxlen = 100;
function CheckLength() {
 var textbox = document.getElementById("<%= TextBox1.ClientID %>").value;
 if (textbox.trim().length >= maxlen) {
  return false;
 } else {
  return true;
 }
}
半角文字であれば、上記の関数で問題はないだろうが、全角文字のチェックはできない。つまり、日本語環境では上記のチェックも役に立たない。これを対応させるのは OS やブラウザの差異によりかなり厳しいようだ。
また、半角であっても貼り付け(ペースト)られると全く意味がないので、貼り付け用のチェックを追加する。
// onblurイベントにセットする関数。
function TrimValue() {
 var textbox = document.getElementById("<%= TextBox1.ClientID %>").value;
 if (textbox.trim().length > maxlen) {
  document.getElementById("<%= TextBox1.ClientID %>").value = textbox.substr(0,maxlen);
  return;
 } else {
  return;
 }
}

jQuery で制御する手もある

jQuery が使えるなら、上記の例を一挙に解決することができる。しかも、変換前の日本語(全角)もカウントする。素晴らしい。
と思ったら、Chrome でしか動かない。だめだこりゃ…。
$(function() {
 var maxlength = 100;
 var tb = $('textarea[id$=TextBox1');
 $(tb).keyup(function() {
  var len = $(this).val().length;
  if (len > maxlength) {
   var s = $(this).val().slice(0, maxlength);
   $(this).val(s);
  }
 });
});
小手先だが、このような JavaScript で対応するしかないのだが、肝心なことは サーバー側でのチェックを必ず入れること である。

正規表現で URL を抽出

C# の正規表現で、URL から値を抽出したい場合の例。
// 例えば、以下のページからアクセスしてきた場合の、hoge1 を修得する。
// http://exsample.com/category/hoge1/index.aspx
Regex regex = new Regex("/category/(?<dir>.*?)/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match m = regex.Match(Request.UrlReferrer.OriginalString);
// テスト用
//Match m = regex.Match("http://exsample.com/category/hoge1/index.aspx");
if (m.Success)
{
    string dir = m.Groups["dir"].Value;
}

マネージパイプラインモードの統合について(Managed Pipeline Mode)

ASP.NET 設定が、統合されたマネージ パイプライン モードで適用されないことが検出されました。

ASP.NET 2.0 の互換性について

ASP.NET 2.0 時台に作成したアプリケーションを、マネージパイプラインモードが「統合」に設定されたアプリケーションプールにアタッチするとアプリケーションが開始できない。
マネージパイプラインモードを「クラシック」に設定するか(推奨されない)、Web.config の設定を変更する必要がある。今回のケースでは、以下の要素を追加したところ動作するようになった。
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
以下に細かいガイドラインがある。

IIS 7 での ASP.NET 2.0 の互換性に影響する変更点
https://technet.microsoft.com/ja-jp/library/ff454090.aspx

Ajax.NET の互換性

validateIntegratedModeConfiguration="false" を Web.config に追記することで統合モードでの動作は確認できた。しかし、この状態では AJAX.NET が動作しない。[Ajax.AjaxMethod] 属性を付与したクラスを動作させるためには、さらに Web.config に追記する必要がある。
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
      <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </modules>
    <handlers>
      <remove name="WebServiceHandlerFactory-Integrated" />
      <add verb="POST,GET" name="Ajax" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </handlers>
  </system.webServer>

ASP.NET の customerrors

ASP.NET において、web.config の customerrors 設定をよく忘れるのでメモ。
業務用途だと独自のエラー画面に飛ばすことが多いが、これだと画面からはエラー内容がわかりづらいケースが多いので(ログを探すのも面倒…)、パッと確認したい時のメモ。

エラーを画面に出したい

<customErrors mode="Off" />

独自のエラー画面を出したい

defaultRedirect に URL を指定する。URL が間違えていると、IIS の 404 エラーが発生するので注意する。
<customErrors mode="On" defaultRedirect="error.html" />

リモートクライアントのみエラー画面を出したい

この設定を行うためにはクライアントの設定もしてあるはずなので、通常はあまり使わないかもしれない。
<customErrors mode="RemoteOnly" />
いずれの場合も特に注意すべきは mode の値。それぞれ Off, On, RemoteOnly であり、OFF や off は許容されないので気をつける。

Google 日本語入力に顔文字(Kaomoji)を追加

Google 日本語入力は標準では顔文字辞書がないので、MS-IME 用の顔文字辞書を追加する。なお、以下の取り込み方法で、自分で作成した辞書についても同様に取り込むことができる。

顔文字辞書のダウンロード

いずれの顔文字でもよいが、テキスト形式(.txt)であること。

新規辞書の登録

  1. Google 日本語入力のオプション画面を開く。Windows 8.1 系であれば、コントロールパネル → 言語 → 言語のオプション から。
  2. 管理 → 新規辞書にインポート
  3. 取り込みたい辞書を選択し、辞書名を入力したあと、インポートボタンを押下する。なお、辞書名はすでに登録されている辞書と同じ名前にできないので、別名にしなければならない。
  4. ファイルの内容が正しければ、Google 日本語入力に指定されたファイルの単語が登録される。
なお、ATOK 用の辞書も同様の方法で取り込むことができる。

Flickr 4.0 へのアップデート

Flickr が久しぶりにアップデート。

Flickr 4.0

画面デザインだけではなく、ローカルの HDD 内の指定フォルダを自動バックアップする Uploadr というツールも提供が開始された。ただし、同様の事ができる iOS と Android の Flickr アプリは日本語対応なしという残念な結果となってしまった。

Magic View

自動的に分類されたカテゴリーごとに表示させる機能が追加された。画像認識による振り分けがされているらしい。

今回のアップデートでは、写真共有から大量の写真をアップするための「ストレージ」としての機能が強化されているようだ。

Flickr
https://www.flickr.com/

spモード経由のアクセスではないため、ご利用になれません(400)

ドコモ用 設定サイトの一部では、Wi-Fi を無効にしないと(ドコモ回線ではないと)接続できないサイトがある。
SP モード経由の~というエラーメッセージではなく、Wi-Fi 接続ではこのページは利用できません、くらいにしてもらいたいものである。