画面項目の表示形式や、入力検証を一元化して定義するためのメタデータクラスを考えてみました。
今回使用した画面表示の元となる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タグの属性をここで定義します。
これは自作属性なのでデフォルトでは存在しません。
以下に作成手順と参考サイトを記事にしました。
・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
余談ですが、上記のようなメタデータクラスを本格的に作成しようとしたきっかけは、
inputタグのmaxlengthをビューに記載したくなかったという思いが強いからです。
ビュー側ではスタイル、デザイン等の記述にとどめたかったので。。。