列挙型A
public enum Positions { Start, Middle, End }
列挙型B
public enum Positions { 最初, 間, 最後 }
どっちでいいだろ?って言われたらお終いなんですが、今まで半角英数で統一してんのに列挙型だけ例外とするのも気持ちが悪いというか…。当然、開発上のルールとしてメンバは必ず半角英数でって話だってあると思うのでとりあえず何とかしたいと思ったわけです(そんなものとは無縁の世界で生きてはいますが…)。
一番簡単な案としては列挙型をやめちゃってDictionaryなりListなりのユーザー定義型でやっちゃえばいいんですが、それだと根本的な趣旨から外れちゃうんで却下。で、色々と調べたところカスタム属性を使う方法等もあったんですが今回は拡張メソッドで何とかなりそうだぞってことが分かったのでこれでやってみます。(参考にさせていただいた記事:当面C#と.NETな記録)(ついでにMSDN:方法 : 列挙型対応の新しいメソッドを作成する)
列挙型Aに拡張メソッドを実装
public enum Positions { Start, Middle, End } public static class PositonExtensions { public static string GetDisplayName(this Positions position) { switch (position) { case Positions.Start: return "最初"; case Positions.Middle: return "間"; case Positions.End: return "最後"; default: return string.Empty; } } }
コード自体はシンプルです。さて、これで今日は終了としても良いですが、このままじゃ中身のないマルパク記事じゃねーかって話になっちゃうので
Userモデルを修正
public class User { //・・・中略 public Positions Position { get; set; } }
コントローラーを修正
public ActionResult Edit() { //・・・中略 //SelectListで使えるようLinqを使って定義してみた var divisons = from p in (Positions[])Enum.GetValues(typeof(Positions)) select new { Value = p, Display = p.GetDisplayName() }; ViewBag.Positions = new SelectList(divisons, "Value", "Display", user.Position); return View(user); }
ビューを修正(一部抜粋)
<div class="editor-label"> @Html.LabelFor(model => model.Position) </div> <div class="editor-field"> @Html.DropDownListFor(model => model.Position, ViewBag.Positions as SelectList) @Html.ValidationMessageFor(model => model.Position) </div>
実行結果
駆け足ですがこんな感じになります。コントローラーでのViewBagのSelectListに値と表示を定義するためにLINQを使った以外はほとんど過去記事と変わりません。
では今日はここまで。