ASP.NET MVC + Entity Frameworkで列挙体を扱う
Entity Frameworkで列挙体を扱おうとしてかなりはまりました。綺麗にかけないw
まずDBでは列挙体は扱えないのでModelではintとして扱うことになります。これではうまく列挙体を表示できないだろううということで調べて見つけたのがEnumDataType。列挙体の代わりにint型で扱っているメンバーにそれを設定してやるとDisplayFor()にEnumDataTypeで設定した列挙体のメンバーにDescription属性を設定してやって渡すと指定した名前で表示してくれたり、EditerFor()でドロップダウンを生成したりしてくれないんですね。
そこでどうしたらいいのか調べました。
色々調べるとintで扱うんじゃなくてデータベースから引っ張ってきたらコードでは列挙体で扱えよと言わんばかりのコードがたくさん見つかりましたが、Modelにintを列挙体に変換したり列挙体からintに変換するコードを書くのが嫌だったので頭捻って遊んで見ました。
使い方はこんな列挙体に対して
ね、すっきりでしょ?コードの本体の大本はstackoverflowにおいてあったコードです。
では拡張メソッド本体をどうぞ。拾い物を改造したので適当に使ってください。難しいことはごちゃごちゃ言いませんw
//…使う方はきれいだけど内側がかなりグロテスクなことしてて、もうちょっと何とかならないのかなぁと思ってたり。
まずDBでは列挙体は扱えないのでModelではintとして扱うことになります。これではうまく列挙体を表示できないだろううということで調べて見つけたのがEnumDataType。列挙体の代わりにint型で扱っているメンバーにそれを設定してやるとDisplayFor()にEnumDataTypeで設定した列挙体のメンバーにDescription属性を設定してやって渡すと指定した名前で表示してくれたり、EditerFor()でドロップダウンを生成したりしてくれないんですね。
そこでどうしたらいいのか調べました。
色々調べるとintで扱うんじゃなくてデータベースから引っ張ってきたらコードでは列挙体で扱えよと言わんばかりのコードがたくさん見つかりましたが、Modelにintを列挙体に変換したり列挙体からintに変換するコードを書くのが嫌だったので頭捻って遊んで見ました。
使い方はこんな列挙体に対して
public enum Gender { [Description("その他")] Other = 0, [Description("男性")] Male = 1, [Description("女性")] Female = 2, }こうやってModelを作って
public class Customer { [EnumDataType(typeof(Gender))] public int Gender { get; set; } }Viewではこんなふうに指定してやるとうまく表示されます。
@foreach (var item in Model) { @Html.DisplayEnumFor(_=> item.Gender) } @Html.EnumDropDownListFor(model => model.Gender)
ね、すっきりでしょ?コードの本体の大本はstackoverflowにおいてあったコードです。
では拡張メソッド本体をどうぞ。拾い物を改造したので適当に使ってください。難しいことはごちゃごちゃ言いませんw
//…使う方はきれいだけど内側がかなりグロテスクなことしてて、もうちょっと何とかならないのかなぁと思ってたり。
コメント
コメントを投稿