‘ASP.Net’ カテゴリーのアーカイブ

.Net FrameworkのUriエンコードメソッドの違い

2010年7月16日 金曜日

.Net FrameworkにはUriエンコードに使うメソッドがいくつかあるが、違いを調べてみた。

Uri.EscapeDataString(str)
RFC2396準拠。16進数は大文字になる。
Uri.EscapeUriString(str)
EscapeDataStringよりエンコードしない記号が増える。「&+,/:;=?」
16進数は大文字。
Url全体をまるごと処理することを想定?
HttpUtility.UrlEncode(str)
EscapeDataStringと違うのは、空白を%20でなく「+」に変える。
「~」を%7eに変える。「’」を%27に変える。
16進数は小文字。
application/x-www-form-urlencodedに使うことを想定?

Uriクラスのメソッドは、国際化リソース識別子 (IRI) または国際化ドメイン名 (IDN) 解析を有効に設定するとRFC3986準拠になるようだが、システム全体が変わってしまうようなので、個別にやるにはRFC3986で増える予約記号「!’*()」を後から置換するのが現実的かも。

Visual Studio 2010でjQueryのインテリセンスが効かなかったので

2010年5月11日 火曜日

いろいろと調べたところ、プロジェクトのobj\Debug、obj\Releaseの各フォルダにできる、DesignTimeResolveAssemblyReferencesInput.cacheというファイルに、jQuery-1.4.1-vsdoc.jsファイルの参照が含まれてないのが原因のようだった。

ソリューションエクスプローラ上でjQuery-1.4.1-vsdoc.jsファイルを一旦「プロジェクトから除外」し、 再び「プロジェクトに含める」を実行する操作をDebugモードとReleaseモードそれぞれで行ったところ、直った。

ASP.Net MVC 2の主な新機能

2010年4月25日 日曜日
○HTMLヘルパーを使ってフォームのコントロールを出力するときにIDの文字列を渡す必要がなくなった
今までは
<%= Html.TextBox(“ProductName”, model.ProductName) %>
と書いて
<input id=”ProductName” name=”ProductName” type=”text” value=”xxxxxx” />
のように出力していたが、下記のようにIDの文字列を渡す必要がなくなった。
<%= Html.TextBoxFor(model => model.ProductName) %>
○モデルクラスのプロパティにAttributeをつけることによってバリデーションをサーバ、クライアントの双方でできるようになった
System.ComponentModel.DataAnnotations名前空間下にある下記のAttributeが使用可能。
[Required]、[StringLength]、[Range]、[RegularExpression]
以下使用例。
[Required(ErrorMessage = "名前を入力してください。")]
[StringLength(50, ErrorMessage = "50文字以内です。")]
[Range(0, 120, ErrorMessage = "入力できる数字は0から120までです。")]
[ReqularExpression("^[0-9]{3}-?[0-9]{4}$”, ErrorMessage = “”]
クライアントでもチェックできるようにするにはViewに

<script src=”Scripts/MicrosoftAjax.js” type=”text/javascript></script>
<script src=”Scripts/MicrosoftMvcValidation.js” type=”text/javascript></script>

<% Html.EnableClientValidation(); %>

の3行を追加する。

ADO.Net Entity Frameworkのようにツールで自動生成するモデルを使っている場合は、
自動生成時に属性がなくならないように下記のようにする。
まずPartialクラスのファイルにMetadataType属性を追加する。

[[MetadataType(typeof(PersonMetadata))]
public partial class Person
{
}

次にメタデータクラスを追加して、プロパティに対してバリデーションを設定する。

[Bind(Exclude="ID")]
public class PersonMetadata
{
     [Required(ErrorMessage = "名前を入力してください。")]
     public string Name { get; set; }
}

ValidationAttributeクラスを継承したクラスを作ることによって、独自の検証属性を作ることも可能。

○Actionメソッドでデフォルト値を使えるようになった。
{controller}/{action}/{id}
のようなUrlの時に、

public ActionResult View(int id, [DefaultValue(1)]int page) {
  }

のような使い方が可能。

○非同期コントローラのサポート
非同期コントローラを使うことで負荷の高いサイトでサーバがスレッドプールを使い果たしてしまうのを防げる。

参考サイト

http://www.asp.net/learn/whitepapers/what-is-new-in-aspnet-mvc/

http://www.atmarkit.co.jp/fdotnet/scottgublog/20100113aspnetmvc2/aspnetmvc2.html

ASP.Net MVCでページキャッシュを行い、DB更新時にキャッシュを破棄するには。

2010年2月10日 水曜日

データベースキャッシング機能を有効にする。データベース名が「TestDB 」、キャッシュ機能を有効にしたいテーブル名が「Table1 」である場合、Visual Studio 2008コマンドプロンプトで下記を実行する。

aspnet_regsql.exe -S .\SQLEXPRESS -E -d TestDB -ed
aspnet_regsql.exe -S .\SQLEXPRESS -E -d TestDB -t Table1 -et 

Web.configの<system.web>内に下記を設定する。DBへの接続文字列が「TestDBConn」の場合。varyByParam=”*”を指定することで、パラメータごとにCacheが作られるようになる。sqlDependencyを指定することで、指定したDBのテーブルが更新されるとキャッシュが破棄される。

<caching>
      <sqlCacheDependency enabled=”true” pollTime=”5000″>
        <databases>
          <add name=”TestDB” connectionStringName=”TestDBConn” />
        </databases>
      </sqlCacheDependency>
 <outputCacheSettings>
    <outputCacheProfiles>
     <add name=”TestCache” enabled=”true” duration=”3600″ varyByParam=”*” sqlDependency=”TestDB :Table1″ />
    </outputCacheProfiles>
   </outputCacheSettings>
    </caching>

 Asp.Net MVCのControllerクラスのメソッドでOutputCache属性を使ってキャッシュプロファイルを設定する。

    [HandleError]
    public class TestController : Controller
   {
        [OutputCache(CacheProfile = "TestCache")]
        public ActionResult Index(string id)
        {
        }

ASP.Net MVCでSite.master(マスタページ)をそのまま使うとIE6が後方互換モードになってしまう。

2009年12月20日 日曜日

標準のテンプレートだと1行目に空白が入ってしまうため、IE6が後方互換モードになってしまう。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
 ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>

の行を1行目に持ってくればOK。

Windows Server 2008 R2/Windows 7でASP.NetからSQL Serverに接続するユーザが変更された

2009年12月11日 金曜日

以前は「Network Service」で接続したが、アプリケーションプール名が「DefaultAppPool」の場合、「IIS AppPool\DefaultAppPool」で接続できる。

ユーザ、グループの検索画面には検索しても出てこないので、直接入力する。

ASP.Net MVCをIIS 6.0で動かすと「404エラー」になるのを回避するには

2009年11月14日 土曜日
  1. 拡張子「.mvc」をASP.Netにマップする設定をIISのアプリケーションマップに追加するために、スクリプト「C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 1.0\Scripts\registermvc.wsf」を実行する。 ASP.Net MVC 2の場合はregistermvc.wsfがないので、下記のように手動で登録する。
    Webサイトのプロパティ->ホームディレクトリ->構成からアプリケーションの構成を開き、追加ボタンで「アプリケーションの拡張しマッピングの追加/編集を開く。
    実行可能ファイル:c:\windows\microsoft.net\framework\v4.0.30319\aspnet_isapi.dll
    拡張子:.mvc
    動詞:制限 GET,HEAD,POST
    スクリプトエンジン:チェック
    ファイルの存在を確認する:チェックなし
    に設定し、「OK」ボタンをクリックする。
  2. アプリケーションの「Global.aspx」のMapRouteを変更して、「.mvc」の拡張子をコントローラ名に追加して、「{controller}.mvc/{action}/{id}」のようにする。また、あらたにRootに対するマップを追加して、ルートUrlのアクセスを/Home/Indexにマップする。変更後のコードは下記。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{

public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
                "Default",
                "{controller}.mvc/{action}/{id}",
                new { action = "Index", id = "" }
              );

routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );

}

protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}