enum
ラジオボタン、ドロップダウン、チェックボックスなどを選択するために、とカスタムクラスを使用していSelector
ます。NHibernateを使用しています。単一の選択(ラジオボタン、ドロップダウン)で、属性からの値[Display(Name = "[Some Text]")]
がデータベーステーブルに入力されます(注:使用する拡張機能を使用していますDisplay(Name)
)。ただし、複数の選択(チェックボックス、マルチリスト)があると、選択の値をenum
データベースに取り込む方法がわかりません。
これが私のモデルの一部です(それぞれ別々のファイルにあります)(編集:問題をさらに混乱させないように、それらに一般的な名前を付けました):
public enum MyEnum
{
[Display(Name = "Text for enum1")]
enum1,
//Left out 2 - 10 for brevity
[Display(Name = "Text for enum10")]
enum10
}
...
public class MyEnumSelectorAttribute : SelectorAttribute
{
public override IEnumerable<SelectListItem> GetItems()
{
return Selector.GetItemsFromEnum<MyEnum>();
}
}
...
[Display(Name = "This is a checkboxlist (select one or more check boxes)?")]
[MyEnumSelector(BulkSelectionThreshold = 10)]
public virtual List<string> MyEnumCheckBox { get; set; }
...
public List<string> MyEnumCheckBox
{
get { return Record.MyEnumCheckBox; }
set { Record.MyEnumCheckBox = value; }
}
そしてSelector.cs
、ラジオボタン、チェックボックス、ドロップダウンなどを選択するのに役立つクラス(問題に関連する場合)は次のとおりです。
public class Selector
{
public IEnumerable<SelectListItem> Items { get; set; }
public string OptionLabel { get; set; }
public bool AllowMultipleSelection { get; set; }
public int BulkSelectionThreshold { get; set; }
public static string GetEnumDescription(string value, Type enumType)
{
var fi = enumType.GetField(value.ToString());
var display = fi
.GetCustomAttributes(typeof(DisplayAttribute), false)
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (display != null)
{
return display.Name;
}
return value;
}
public static IEnumerable<SelectListItem> GetItemsFromEnum<T>
(T selectedValue = default(T)) where T : struct
{
return from name in Enum.GetNames(typeof(T))
let enumValue = Convert.ToString((T)Enum.Parse
(typeof(T), name, true))
select new SelectListItem
{
Text = GetEnumDescription(name, typeof(T)),
Value = enumValue,
Selected = enumValue.Equals(selectedValue)
};
}
}
public static class SelectorHelper
{
public static IEnumerable<SelectListItem> ToSelectList
(this IEnumerable data)
{
return new SelectList(data);
}
public static IEnumerable<SelectListItem> ToSelectList
(this IEnumerable data, string dataValueField,
string dataTextField)
{
return new SelectList(data, dataValueField, dataTextField);
}
public static IEnumerable<SelectListItem> ToSelectList<T>
(this IEnumerable<T> data, Expression<Func<T, object>>
dataValueFieldSelector, Expression<Func<T, string>>
dataTextFieldSelector)
{
var dataValueField = dataValueFieldSelector.ToPropertyInfo().Name;
var dataTextField = dataTextFieldSelector.ToPropertyInfo().Name;
return ToSelectList(data, dataValueField, dataTextField);
}
}
このクラスは、選択するロジック(ラジオボタン、チェックボックスなど)を判断するためのロジックをSelector
備えたテンプレートとペアになっています。Selector.cshtml
List<string>
、、、、、のいずれかを試してみるとList<MyEnum>
、さまざまなエラーが発生します。このエラーは、を使用するため、チェックボックスまたはマルチリストでのみ発生します。たとえば、ドロップダウンはエラーなしで正常に機能します。これは、動作し、NHibernateを介してDBにマッピングできるサンプルドロップダウンモデル(上記で再利用可能)です。IList<string>
IList<MyEnum>
IEnumerable<MyEnum>
IEnumerable<MyEnum>
List<string>
enum
[Required(ErrorMessage = "Please select one option")]
[Display(Name = "This is a dropdown list (select one option)?")]
[MyEnumSelector(BulkSelectionThreshold = 0)] //0 selects dropdown
public virtual MyEnum? MyEnumDropDown { get; set; }
public MyEnum? MyEnumDropDown
{
get { return Record.MyEnumDropDown; }
set { Record.MyEnumDropDown = value; }
}
これが私が試したことに基づいて私が得ているエラーのいくつかです:
List<string>
エラー:
NHibernate.Transaction.ITransactionFactory-DTCトランザクションの事前準備フェーズが失敗しましたNHibernate.PropertyAccessException:無効なキャスト(プロパティタイプの不一致についてマッピングを確認してください); MyNameSpace.Models.MyRecordのセッター--->System.InvalidCastException:タイプ'NHibernate.Collection.Generic.PersistentGenericBag1
1[System.String]' to type 'System.Collections.Generic.List
[System.String]'のオブジェクトをキャストできません。
List<MyEnum>
エラー:
NHibernate.Transaction.ITransactionFactory-DTCトランザクションの事前準備フェーズが失敗しましたSystem.InvalidCastException:タイプ'System.Collections.Generic.List1
1[MyNameSpace.Models.MyEnum]' to type 'System.Collections.Generic.ICollection
[System.String]'のオブジェクトをキャストできません。
IList<string>
エラー:
NHibernate.AdoNet.AbstractBatcher-コマンドを実行できませんでした:INSERT INTO MyEnumCheckBox(MyRecord_id、Value)VALUES(@ p0、@ p1)System.Data.SqlServerCe.SqlCeException(0x80004005):指定されたテーブルは存在しません。[MyEnumCheckBox]
<MyEnum>
私が試した他のバリエーションは、使用した場合に次のようなエラーが表示されることを除いて、同様のエラーでした。
System.Collections.Generic.List
1[MyNameSpace.Models.MyEnum]' to type 'System.Collections.Generic.ICollection
1[System.String]'。
NHibernateを使用してenum
複数の選択されたを挿入しようとするときに、このシナリオでのを使用する方法について何か考えはありますか?enum