2013-03-03 3 views
0

Пытается сохранить выделение с помощью CheckBoxList в виде списка с разделителями-запятыми (string) в БД (выбран один или несколько вариантов). Я использую прокси, чтобы сохранить как string, потому что в противном случае мне пришлось бы создавать отдельные таблицы в БД для отношения - работа не стоит этого для этого простого сценария, и я надеялся, что могу просто преобразовать его в a string и избегайте этого.Пытается с того, чтобы сохранить список, разделенный запятой

CheckBoxList использует enum для его выбора:

public enum Selection 
{ 
    Selection1, 
    Selection2, 
    Selection3 
} 

Не быть свернуты, но я использую [Display(Name="Choice 1")] и класс расширения, чтобы отобразить что-то дружелюбное на пользовательском интерфейсе. Не уверен, могу ли я сохранить это string, а не только enum, хотя я думаю, что если я сохраню как enum, для меня не очень важно «отобразить» дружественную строку в пользовательском интерфейсе на странице подтверждения.

Это «Record» класс, который сохраняет в БД в string:

public virtual string MyCheckBox { get; set; } 

Это «прокси», который некоторые примеры я нашел, но не непосредственно дело с enum, и который использует IEnumerable<string> (или это должно быть IEnumerable<Selection>?):

public IEnumerable<string> MyCheckBox 
{ 
    get 
    { 
     if (String.IsNullOrWhiteSpace(Record.MyCheckBox)) return new string[] { }; 
      return Record 
       .MyCheckBox 
       .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(r => r.Trim()) 
       .Where(r => !String.IsNullOrEmpty(r)); 
    } 
    set 
    { 
     Record.MyCheckBox = value == null ? null : String.Join(",", value); 
    } 
} 

чтобы сохранить в БД, я пытаюсь сделать это в создании класса:

proxy.MyCheckBox = record.MyCheckBox; //getting error here 

, но я получаю сообщение об ошибке:

Cannot implicitly convert 'string' to System.Collections.Generic.IEnumerable'

Я не знаю, если это возможно, или лучше, чтобы использовать Parse или ToString из API для значений перечислений.

Я знаю, что делать что-то подобное будет хранить все, что я положил в ("") в БД, так что это просто вопрос выяснить, как преодолеть ошибки (или, если есть альтернатива):

proxy.MyCheckBox = new[] {"foo", "bar"}; 

Я не очень хорошо разбираюсь в этом материале и только что копаю и копаю, чтобы придумать решение. Буду признателен за любую оказанную помощь.

+0

вашего кода геттерные расщепляется на '' а сеттер присоединяется к ','. Это верно? –

+0

извините, это типографский код –

+0

Итак, MyCheckBox вашего прокси-сервера IEnumerable , тогда как Record.MyCheckBox - это строка. Эти два несовместимы при назначении. Я не уверен, что у меня есть цель «прокси» здесь. –

ответ

0

Вы можете выполнить это, используя пользовательский тип пользователя. В приведенном ниже примере используется класс ISet<string> и сохраняет значения в виде строки с разделителями.

[Serializable] 
public class CommaDelimitedSet : IUserType 
{ 
    const string delimiter = ","; 

    #region IUserType Members 

    public new bool Equals(object x, object y) 
    { 
     if (ReferenceEquals(x, y)) 
     { 
      return true; 
     } 
     var xSet = x as ISet<string>; 
     var ySet = y as ISet<string>; 
     if (xSet == null || ySet == null) 
     { 
      return false; 
     } 
     // compare set contents 
     return xSet.Except(ySet).Count() == 0 && ySet.Except(xSet).Count() == 0; 
    } 

    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var outValue = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string; 
     if (string.IsNullOrEmpty(outValue)) 
     { 
      return new HashSet<string>(); 
     } 
     else 
     { 
      var splitArray = outValue.Split(new[] {Delimiter}, StringSplitOptions.RemoveEmptyEntries); 
      return new HashSet<string>(splitArray); 
     } 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     var inValue = value as ISet<string>; 
     object setValue = inValue == null ? null : string.Join(Delimiter, inValue); 
     NHibernateUtil.String.NullSafeSet(cmd, setValue, index); 
    } 

    public object DeepCopy(object value) 
    { 
     // return new ISet so that Equals can work 
     // see http://www.mail-archive.com/[email protected]/msg11054.html 
     var set = value as ISet<string>; 
     if (set == null) 
     { 
      return null; 
     } 
     return new HashSet<string>(set); 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public object Assemble(object cached, object owner) 
    { 
     return DeepCopy(cached); 
    } 

    public object Disassemble(object value) 
    { 
     return DeepCopy(value); 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new[] {new SqlType(DbType.String)}; } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(ISet<string>); } 
    } 

    public bool IsMutable 
    { 
     get { return false; } 
    } 

    #endregion 
} 

Использование в файле отображения:

Map(x => x.CheckboxValues.CustomType<CommaDelimitedSet>();