2014-11-28 3 views
0

Я веду себя в борьбе с определением выбранных данных из объекта HtmlHelper.DropDownListFor. Проблема в том, что нет единственного свойства модельного класса, который мог бы однозначно идентифицировать модель.DropDownListFor Value Field - Идентификатор комбинации свойств

Ниже приведены мои модели и классы viewmodel, а также образец вызова HtmlHelper.DropDownListFor в представлении.

public class MyModel 
{ 
    public int ParentId { get; set; } // combined with ChildId is the unique identifier 
    public int ChildId { get; set; } // see above 
    public string Name { get; set; } // not unique 
} 

public class MyViewModel 
{ 
    public IEnumerable<MyModel> MyModels { get; set; } 

    public <???> SelectedItem { get; set; } 
} 

@Html.DropDownListFor(m => m.SelectedItem, new SelectList(Model.MyModels, "DataValueField", "Name")) 

Проблема здесь состоит в том, что единственный уникальный idenfier из MyModelявляется сочетание из ParentId и ChildId. Итак, каков был бы лучший способ получить данные, чтобы однозначно идентифицировать выбранный элемент?

Чтобы построить уникальный идентификатор одного из этих объектов модели будет похож на следующий (бизнес-логики):

ModelUniqueIdentifier = ParentId * 100 + ChildId 

Но я не вижу, каким-либо образом исполнять эту логику, чтобы установить MyViewModel.SelectedItem этому ,

Когда есть обратная передача из любых триггеров формы для отправки, я хотел бы иметь возможность захватить выбранное значение из свойства модели SelectedItem, чтобы выполнить другую обработку. Но с одномерным "DataValueField" я не уверен, что это лучший способ.

Наиболее очевидным способом обойти это было бы введение суррогатного ключа в данные в виде идентификатора одиночного тона. Но с этими конкретными данными есть только этот очевидный составной естественный ключ, который делал большую работу до этого момента.

Так двумерная данные выглядит следующим образом:

ParentId ChildId Name 
7   3  Name1 
4   8  Name2 
5   3  Name3 
4   6  Name4 

Если бы я должен был добавить суррогатный ключ к данным он будет делать работу:

SurrogateId ParentId ChildId Name 
0   7   3  Name1 
1   4   8  Name2 
2   5   3  Name3 
3   4   6  Name4 

В то время как это будет работать, это потребовал бы, чтобы я изменил базовую таблицу, модель и большой объем ссылочного кода, поэтому, если мне не нужно добавлять этот суррогатный ключ, я бы предпочел не делать этого.

Любые мысли или идеи? Заранее спасибо!

+0

Ваш принятый ответ вряд ли решит проблему. Вы не смогли бы привязать модель к обратной передаче, и если вы получите, если из 'Request.Form', как бы вы преобразовали значение обратно в его значения« ParentId »и« ChildId »? Вы можете использовать функцию [спаривания] (http://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function), хотя я бы рекомендовал укусить пулю и исправить базу данных, чтобы дать таблице уникальное поле ID –

+0

. Я закончил работу с суррогатный ключ в данных и, в свою очередь, модельный класс. –

ответ

1

Вы можете попробовать использовать рассчитанное свойство get в своей модели, которое генерирует ваш уникальный идентификатор при вызове. Затем передайте «UniqueId» в качестве поля данных для списка выбора/выпадающего списка. Например.

public class MyModel 
{ 
    public int UniqueId { 
     get { 
      return ParentId * 100 + ChildId; 
     } 
    } 
    public int ParentId { get; set; } // combined with ChildId is the unique identifier 
    public int ChildId { get; set; } // see above 
    public string Name { get; set; } // not unique 
} 

SelectItem тогда будет int в этом случае.

+0

Спасибо за мысль, я понимаю, что вы имеете в виду. Это все равно заставит меня изменить класс модели. Если бы был какой-то способ изменить определение класса, это было бы лучше всего. Имеет ли это смысл? –

+0

Хорошо, есть ли причина, по которой вы не хотите добавлять класс модели? На что относятся поля ParentId и ChildId? например, является ли ParentId и ChildId каким-то возвратно-поступательным отношением? Поэтому ParentId ссылается на другого Ребенка в другой записи. Просто пытаюсь обойти данные, которые вы держите. –

+0

В итоге я перешел к суррогатным ключевым подходам. Благодаря! –

Смежные вопросы