SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET MVC 2入門

ASP.NET MVC 2による検証機能

ASP.NET MVC 2入門(中編)


クライアントサイド検証の実装

 クライアントサイド検証は以下の手順で実装します。

  • クライアントサイド検証ルールのコンテナとなるアダプター(JPNAndUSAOnlyValidator)の作成
  • 作成したアダプターの登録
  • ViewPage側で実行する検証スクリプトの記述

 順に解説します。まずはクライアントサイド検証を行うアダプターの作成です。

クライアントサイド検証ルールのコンテナとなるアダプター(JPNAndUSAOnlyValidator)の作成

 クライアントサイド検証を行うアダプターの役割は、属性で指定したエラーメッセージや、RangeAttributeなどで設定するパラメータの値などの検証ルールのコンテナです。記載は次のとおりです。

JPNAndUSAOnlyValidator.csファイルの記載例
using System;
using System.Collections.Generic;
using System.Web.Mvc;

  //(1)クラスの作成
  public class JPNAndUSAOnlyValidator : DataAnnotationsModelValidator<JPNAndUSAOnlyAttribute>
  {
    string _message;
    // パラメータがある場合はここにフィールド変数を定義

    //(2)コンストラクタ
    public JPNAndUSAOnlyValidator(ModelMetadata metadata, ControllerContext context, JPNAndUSAOnlyAttribute attribute)
      : base(metadata, context, attribute) {
        _message = attribute.ErrorMessage;
        // パラメータがある場合はここで値を設定
    }

    //(3)クライアントへの検証メタデータの準備
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
      var rule = new ModelClientValidationRule
      {
        ErrorMessage = _message,
        ValidationType = "jpnandusaonly"
      };
      return new[] { rule };
    }

  }

 上記コードについて順に解説します。

(1)クラスの作成

 その名のとおり、モデルの検証を行うDataAnnotationsModelValidatorクラスに対してJPNAndUSAOnlyAttributeクラスを指定し、JPNAndUSAOnlyValidatorクラスを生成します。

(2)コンストラクタ

 コンストラクタは、DataAnnotationsModelValidatorのものを使います。パラメータは次のとおりです。

  • モデルのメタデータ(metadata)
  • モデルのコントローラーのコンテキスト(context)
  • モデルの検証属性(attribute)

 attribute.ErrorMessageメソッドでJPNAndUSAOnlyAttribute属性で指定されたエラーメッセージを取得し、アダプター内のフィールド変数_messageに設定しています。もし、カスタム属性にパラメータ指定が必要な場合は、フィールド変数を用意し、attribute.パラメータプロパティ名と記述することで値の取得と設定ができます。

(3)クライアントへの検証メタデータの準備

 クライアントサイドに検証ルールを渡すGetClientValidationRulesメソッドをオーバーライドします(戻り値は、IEnumerable<ModelClientValidationRule>)。ModelClientValidationRuleクラスはJSON形式で検証ルールを渡すためのコンテナクラスです。

 オーバーライドしたメソッド内ではJSON形式の変数を用意して返しているだけです。

 JSONの値となるrule変数内に、ModelClientValidationRuleオブジェクトを格納しています(ErrorMessageプロパティにエラーメッセージを、ValidationTypeプロパティに検証の型を指定しています)。

 以上がアダプターの作成です。続いて、作成したアダプターの登録を行います。

作成したアダプターの登録

 クライアントサイドにアダプターの値を渡すためにはGlobal.asaxファイルのApplication_Startメソッドに登録が必要です。記載は次のとおりです。

Global.asax.csファイルの記載例
using CodeZineMVC2.Models;
  protected void Application_Start()
  {
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(JPNAndUSAOnlyAttribute), typeof(JPNAndUSAOnlyValidator));
  }

 DataAnnotationsModelValidatorProviderクラスは、DataAnnotationを利用した検証を行うプロバイダを登録するクラスです。RegisterAdapterメソッドの第1パラメータに検証属性の型を、第2パラメータにアダプターの型を設定します。これでカスタム属性と、アダプターの登録は完了です。最後にクライアントサイドでのスクリプトの記載です。

ViewPage側で実行する検証スクリプトの記述

 これまでの設定では、JSON形式のデータだけが渡されている状態なので、クライアントサイドの検証はできません。2度手間に感じるかもしれませんが、クライアントサイドでもサーバーサイドの属性同様の検証ロジックを記載することになります。まずは、MVC標準で提供されているライブラリのスクリプト記載例です。

Create.aspxファイルの記載例
<%-- MVC提供のスクリプトを使用する場合 --%>   
<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.js") %>" type="text/javascript"></script> 
<script type="text/javascript">
Sys.Mvc.ValidatorRegistry.validators["jpnandusaonly"] = function (rule) {
  return function (value, context) {
    if(value == false){
      return true;
    } else if (value == 'JPN' || value == 'USA') {
      return true; /* 検証成功 */
    }
    else {
      return rule.ErrorMessage; /* 検証エラー */
    }
  };
}
</script>

 Sys.Mvc.ValidatorRegistry.validatorsメソッドは、アダプターで指定した検証の型を指定します。これにより検証ルール(本サンプルではエラーメッセージのみ)の取得が行われます。後は、JPNAndUSAOnlyAttributeと検証ロジック部分と同等の記述を行うだけです(検証エラー時にはエラーメッセージを返す)。

 実行結果は図4のとおりです。

 続いて、jQueryと、jQuery Validationを使用する場合の例です。記載は次のとおりです。

Create.aspxファイルの記載例(jQuery使用の場合)
<%-- jQueryを使用する場合 --%>
<script src="<%= Url.Content("~/Scripts/jquery-1.4.1.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcJQueryValidation.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery-1.4.1.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcJQueryValidation.js") %>" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
  jQuery.validator.addMethod("jpnandusaonly", function (value) {
    if (value == false) {
      return true;
    } else if (value == 'JPN' || value == 'USA') {
      return true; /* 検証成功 */
    }
    else {
      return false; /* 検証エラー */
    }
  });
});
</script>

 jQuery.validator.addMethodで、アダプターで指定した検証の型を追加しています。後は、前述のスクリプト同様です。こちらの実行結果も図4のようになります。

まとめ

 今回は、MVC 1が苦手としていた検証部分を紹介しました。今回紹介したDataAnnotationを利用した検証はMVC 2アプリケーション開発の基本であり重要なポイントです。ユーザビリティの優れたサイトを構築するためにもクライアントサイド検証も含めて実装することを強くお勧めします。

 また、最後に紹介したカスタムの検証属性を活用することで、検証の応用まで網羅できるため、本記事を参考にMVC 2における検証の足掛かりにしていただければ幸いです。

 後編では非同期コントローラーや、jQuery Templateなどの活用について触れる予定です。お楽しみに。

参考文献

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
ASP.NET MVC 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト ナオキ(ナオキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5316 2010/08/03 13:24

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー