Динамические данные: как отфильтровать выпадающий список для внешнего ключа на странице редактирования - PullRequest
4 голосов
/ 08 марта 2010

Использование Linq-to-SQL и динамических данных.

На экране редактирования динамических данных в раскрывающемся списке перечислены возможные значения внешнего ключа.

Мне нужно отфильтровать значения, перечисленные в этом раскрывающемся списке, предпочтительно добавив предложение where в запрос linq-to-sql.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

Ну, я нашел место для настройки этого, хотя я все еще не нашел способ переопределить или расширить запрос linq для загрузки данных:

В файле \ DynamicData \ FieldTemplates \ ForeignKey_Edit.ascx.cs (согласно расположению по умолчанию) в методе Page_Load выполняется следующий вызов:

PopulateListControl(DropDownList1);

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

При использовании Reflector создается впечатление, что PopulateListControl в конечном итоге использует MetaTable.GetQuery () для получения списка по умолчанию для таблицы. Было бы неплохо доказать это вместо этого ... но теперь перейдем к другим вещам!

4 голосов
/ 12 апреля 2010

Я думаю, что вы уже решили свою проблему, но я хотел бы зарегистрировать свое решение, на случай, если оно кому-нибудь поможет!

Я следовал предложенному вами пути, редактируя ForeignKey_Edit.ascx.cs. После строки PopulateListControl (DropDownList1) я вызываю метод RemoveResultsFromOtherUsers ().

Вот метод:

    private void RemoveResultsFromOtherUsers()
    {
        using (var db = new FinWeb3.DynamicData.FinWebDBDataContext())
        {
            var data = db.GetTable(this.Column.Provider.ColumnType);
            var removableItems = new List<ListItem>();

            foreach (var item in data)
            {
                var dbItem = item as IDbEntity;

                if (dbItem.UserName != this.Context.User.Identity.Name)
                {
                    removableItems.Add(
                        DropDownList1.Items.FindByValue(dbItem.Id.ToString()));
                }
            }

            foreach (var item in removableItems)
            {
                DropDownList1.Items.Remove(item);
            }
        }
    }

IDbEntity - это интерфейс, который реализует весь мой класс linq to sql. Этот интерфейс имеет свойства Id и UserName. Здесь я намерен удалить результаты, которые не зарегистрированы текущим аутентифицированным пользователем.

Спасибо за ваш вопрос и решение!

0 голосов
/ 11 сентября 2014

Я бы создал пользовательский шаблон поля, который является веб-элементом управления пользователя, и ссылался на него в метаданных с помощью атрибута UIHintAttribute. Примечание: вам придется создать стандартную версию (обычно гиперссылку) и версию _Edit (обычно раскрывающуюся).

...