在我目前正在工作的项目中,我们偶然发现需要几种搜索结果呈现控件。搜索结果相似,但不完全相同。例如,在“办公室搜索”结果中,我们可能希望显示办公室名称和位置,而在“文档搜索”中可能包含文档名称,作者和发布日期。这些字段应该是可排序的。
我目前的策略是采用工厂模式并执行以下操作:
ISearchResult officeResults = SearchResultFactory.CreateOfficeSearchResults(data);
ISearchResult documentResults = SearchResultFactory.CreateDocumentSearchResults(data);
问题是:我不知道如何实现标记代码。我应该做什么
Controls.Add(officeResults);
在包含页面中?或者是否有一些ASPX技巧来创建通用Web控件?或者也许我正在过度思考这个并且应该创建五个类? ;)
答案 0 :(得分:1)
Controls.Add(officeResults);
很好。您只需要确保它是一个WebControl(即:它继承自WebControl)。实际上,“控制”是预期的,但就个人而言,如果我正在编写“Web控件”,我将使用/继承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开发 - 我不是说我是世界专家,但你可能会发现一些有用的想法here :(看看“Morphfolia.Core”sln;在Morphfolia.PublishingSystem项目,WebControls文件夹和Morphfolia.WebControls项目中。)