Разработка общего веб-элемента управления результатами поиска - PullRequest
0 голосов
/ 25 мая 2010

В проекте, в котором я сейчас работаю, мы столкнулись с необходимостью в нескольких видах элементов управления представлением результатов поиска. Результаты поиска похожи, но не идентичны. Например, в результате «поиска офиса» мы можем указать название и местонахождение офиса, а в «поиске документа» - имя, автора и дату публикации. Эти поля должны быть сортируемыми.

Моя текущая стратегия - использовать шаблон Фабрики и делать что-то вроде этого:

ISearchResult officeResults = SearchResultFactory.CreateOfficeSearchResults(data);
ISearchResult documentResults = SearchResultFactory.CreateDocumentSearchResults(data);

Проблема в том, что я не знаю, как реализовать код разметки. Должен ли я просто сделать

Controls.Add(officeResults);

на содержащей странице? Или есть какие-то хитрости ASPX для создания общих веб-элементов управления? Или, может быть, я обдумываю это и просто должен создать пять классов? ;)

1 Ответ

1 голос
/ 27 мая 2010
Controls.Add(officeResults);

В порядке. Вам просто нужно убедиться, что это WebControl (т.е. он наследуется от WebControl). На самом деле «Control» - это то, что ожидается, но лично, если я пишу «веб-элемент управления», я буду использовать / наследовать от WebControl.

Я обнаружил, что полезно добавить его "дважды":

Controls.Add(officeResults);   // adds the control to the page (or parent controls) object collection.
myPanel.Controls.Add(officeResults);  // adds the control to where you want it to appear.

Один раз на родительский элемент управления / страницу (в структурном смысле исполняемого файла), а затем один раз на контейнер, в котором я хочу, чтобы он появился (в визуальном / физическом иерархическом смысле). Я заметил, что постбэки, как правило, работали, как и ожидалось, когда я делал это, но это могло быть потому, что я делал что-то еще неправильно в то время. Я уверен, что другие поправят меня, если я сделаю это.

Я бы также посоветовал использовать интерфейс INamingContainer (вам не нужно добавлять код, он все делает сам во время выполнения).

Не уверен, что использовал бы фабрику - я не говорю, что это неправильно, но обычно, если я добавляю элемент управления на страницу (даже динамически), я буду знать, какой из них мне нужен. TextBoxes, Buttons и Tables - это WebControls, и вы бы не создавали и не добавляли их через Factory (по крайней мере, я этого не видел и не чувствовал себя обязанным это делать). Если бы вы использовали фабрику, разве у вас не было бы одного фабричного метода, который определял, какой WebControl возвращать, основываясь на явном параметре, или, возможно, на основе переданных данных?

Просто мысль, надеюсь, это поможет.

Кстати, я немного поработал над WebControl - я не говорю, что я мировой эксперт, но вы можете найти некоторые полезные идеи здесь : (смотрите в «Morphfolia.Core» sln; в проекте Morphfolia.PublishingSystem, папке WebControls и проекте Morphfolia.WebControls).

...