SYSTEM,WEB,MOBILE and DESIGN
ASP.NET MVC

 

画面項目の表示形式や、入力検証を一元化して定義するためのメタデータクラスを考えてみました。

 

今回使用した画面表示の元となるUserInfoテーブルの定義は以下の通りです。

 

 

上記のUserInfoテーブルを取り込んだモデルクラスを生成し、

次にメタデータクラスを作成します。

 

    [MetadataType(typeof(UserInfoMetaData))]
    public partial class UserInfo
    {
    }

    public class UserInfoMetaData
    {
        [ScaffoldColumn(false)]
        public string UserId { get; set; }

        [Required]
        [HtmlProperties(maxlength = 64)]
        [DisplayName("氏名")]
        [DataType(DataType.Text)]
        public string UserName { get; set; }

        [Required]
        [RegularExpression(@"^d{3}[-]d{4}$")]
        [HtmlProperties(maxlength = 8)]
        [DisplayName("郵便番号")]
        [DataType(DataType.Text)]
        public string ZipCode { get; set; }

        [Required]
        [DisplayName("都道府県")]
        [UIHint("Pref")]
        public Int32 PrefId { get; set; }

        [StringLength(200)]
        [DisplayName("備考")]
        [DataType(DataType.MultilineText)]
        public string Note { get; set; }
    }

 

ここではモデルクラスの部分クラス UserInfo を宣言し、メタデータクラス UserInfoMetaData を関連付けています。

 

入力画面のビューの処理は以下のように記述します。

 

<%= Html.EditorFor(model => model) %>

 

必要なのはこれだけです。

EditorForメソッドは、メタデータクラスで定義された各プロパティの属性値を解析し、テキストボックスやテキストエリア等のinputタグを適切に配置する機能を備えています。

ちなみに、表示画面を作りたい場合は DisplayForメソッドを使用します。

 

表示は以下の通りです。

 

 

ラベル、入力タグが自動生成されています。

 

また、入力検証も働いています。

エラーが出るような値を入力すると、、、

 

 

エラーメッセージ出力用のタグも自動で埋め込まれます。

 

このように、画面定義で使用したい値や、入力チェックに使用したい値をメタデータクラスに定義することができます。

 

以下に、メタデータクラスで使用する属性を簡単に紹介いたします。

 

・DisplayName

画面に表示する項目の名称です。

EditorForやDisplayForを実行すると、この属性値が入ったラベルが自動的に作成されます。

 

・ScaffoldColumn

画面に項目を表示するかどうかを設定します。

「true」で表示(デフォルト)、「false」で非表示となります。

 

・Required

必須入力チェックを設定します。

 

・StringLength

入力における最大桁数チェックを設定します。

 

・RegularExpression

正規表現によるチェックを設定します。

 

ちなみに、自分でエラーメッセージを設定したい場合は以下のようになります。

 

[Required(ErrorMessage="{0}は必須です!!")]
[StringLength(10, ErrorMessage="{0}は{1}桁以内で入力してください")]
[RegularExpression(@"^d{3}[-]d{4}$", ErrorMessage="{0}の入力が誤っています")]

 

{0}はDisplayName属性の値です。

StringLengthの{1}には桁数が入っています。

 

・DataType

画面項目の種別を定義しています。

この値から、EditorForはテキストボックス、パスワード、テキストエリア等を判断します。

 

・HtmlProperties

maxlength等のinputタグの属性をここで定義します。

これは自作属性なのでデフォルトでは存在しません。

以下に作成手順と参考サイトを記事にしました。

inputタグに属性を埋め込むメタデータクラス用属性作成

 

・UIHint

表示する際に使用するテンプレートファイル(~.ascx)を設定します。

テンプレートファイルは、Views→自分のコントローラ(ファイルが無い場合はShared)フォルダ配下にある

  • EditorTemplates フォルダ(EditorForから呼ばれる)
  • DisplayTemplates フォルダ(DisplayForから呼ばれる)

の中から検索します。

 

例えば、UIHint(“Pref”)の属性がついた項目を EditorFor で表示しようとすると、以下の都道府県リストボックス作成用の記述がされたテンプレートファイルが呼ばれます。

~ViewSharedEditorTemplatesPref.ascx

 

記述内容は以下のような感じです。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Import Namespace="MvcAddress.Helpers" %>
<%@ Import Namespace="MvcAddress.Models" %>

<%
    // 都道府県取得
    userEntities_db = new userEntities();
    var preflist = (from p in _db.Pref orderby p.PrefId select p).ToList();
    var prefselect = new SelectList(preflist, "PrefId", "PrefName",
                   ViewData.TemplateInfo.FormattedModelValue);
 %>

<%= Html.DropDownList("", prefselect) %>

 

テンプレートファイルは、モデルまたは項目種別ごとにまとめることが可能です。

時間があるときにまとめて記事にしたいと思います。。

 

上記以外にも属性はいろいろあるのですが、以下のサイトが参考になると思いますm(_ _)m

まなBlog | メタデータ・クラス

 

余談ですが、上記のようなメタデータクラスを本格的に作成しようとしたきっかけは、
inputタグのmaxlengthをビューに記載したくなかったという思いが強いからです。
ビュー側ではスタイル、デザイン等の記述にとどめたかったので。。。