HTMLヘルパーの EditorFor や DisplayFor で表示できるデザインを自作できるカスタムテンプレートを調べました。
EditorFor は入力項目、DisplayFor は出力項目生成を補助するHtmlヘルパーです。
出力したい項目はプロパティまたはモデルクラスをラムダ式で引数に指定したりすると、それに応じたタグをHtmlへ出力してくれます。
また、モデルクラス名を直接指定できる EditorForModel、DisplayForModel もあります。
Htmlへ出力する際に使用するカスタムテンプレートファイルの参照場所は以下のとおりです。
- EditorFor、EditorForModel
~Viewコントローラ名(無い場合はShared)EditorTemplates~.ascx
- DisplayFor、DisplayForModel
~Viewコントローラ名(無い場合はShared)DisplayTemplates~.ascx
なお、ファイルが無い場合は型や属性等から自動判別して適切なタグを出力します。
以下はビューに「Address」クラスが強く型付けされた場合のクラス単位での呼び出し例です。
- Html.EditorFor(Model => Model)
→ Address.ascx
- Html.EditorFor(Model => Model, “Entry”)
→ Entry.ascx
- Html.EditorForModel()
→ Address.ascx
- Html.EditorForModel(“Entry”)
→ Entry.ascx
以下はstring型のプロパティの呼び出し例です。
- Html.EditorFor(Model => Model.name)
→ string.ascx
- Html.EditorFor(Model => Model.name, “Name”)
→ Name.ascx
- nameプロパティにDataType属性[DataType(DataType.Text)] を追加して
Html.EditorFor(Model => Model.name)
→ Text.ascx
- nameプロパティにUIHint属性[UIHint(“Name”)] を追加して
Html.EditorFor(Model => Model.name)
→ Name.ascx
それでは、→前回記事でもご紹介した都道府県ドロップダウンリストボックスのソースコードを作成例として挙げます。
以下はメタデータクラスでの属性指定
[UIHint("Pref")]
public Int32 pref_id { get; set; }
以下はビュー側での呼び出し
<%= Html.EditorFor(Model => Model.pref_id) %> <%= Html.DisplayFor(Model => Model.pref_id) %>
以下は EditorTemplatesPref.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Import Namespace="MvcAddress.Models" %> <% // 都道府県取得 AddressEntities _db = new AddressEntities(); 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) %>
以下は DisplayTemplatesPref.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Import Namespace="MvcAddress.Models" %> <% // コードから都道府県名称取得 AddressEntities _db = new AddressEntities(); int prefid = (int)ViewData.TemplateInfo.FormattedModelValue; var preflist = (from p in _db.Pref where p.PrefId == prefid orderby p.PrefId select p); string pref = ""; if(preflist.Count() > 0) { pref = preflist.First().PrefName; } %> <%= Html.Encode(pref) %>
以上です。
誤りなどありましたらご指摘のほどよろしくお願いしますm(_ _)m