【问题标题】:Architecting a generic search result web control构建通用搜索结果 Web 控件
【发布时间】:2010-05-27 17:19:40
【问题描述】:

在我目前工作的一个项目中,我们偶然发现需要多种搜索结果呈现控件。搜索结果相似,但不相同。例如,在“办公室搜索”结果中,我们可能想要显示办公室名称和位置,而在“文档搜索”中可能包含文档名称、作者和发布日期。这些字段应该是可排序的。

我目前的策略是使用工厂模式并执行以下操作:

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

问题是:我不知道如何实现标记代码。我应该这样做吗

Controls.Add(officeResults);

在包含页面?还是有一些 ASPX 技巧来创建通用 Web 控件?或者也许我想太多了,应该创建五个类? ;)

【问题讨论】:

    标签: .net asp.net architecture web-controls


    【解决方案1】:
    Controls.Add(officeResults);
    

    没问题。您只需要确保它是一个 WebControl(即:它继承自 WebControl)。实际上,“控件”是预期的,但就个人而言,如果我正在编写“网络控件”,我将使用/继承 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 项目)。

    【讨论】:

    • 非常有用的建议,谢谢!不知道 INamingContainer,我敢肯定它会派上用场的 :)
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2010-12-13
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多