在asp.net中为数据制作重复模板的好方法

时间:2009-01-15 13:09:18

标签: asp.net templates

我正在构建一个网页,我在首页上显示 n 最新的新闻帖,这是获取帖子并将其返回到.aspx文件的方法。我使用asp:substitution-control将字符串插入网页。

我认为我这样做的方式有点混乱和丑陋,如果我想在模板上做一点改动,那就不灵活了。在将模板本身放在单独的.aspx或.ascx文件中时,有什么方法可以实现我想要的功能吗?我已经尝试了,但是无法想出一种将数据传递到模板文件的智能方法。

另外,当(如果?)我将模板放在一个单独的文件中时 - 我如何在另一个.aspx文件中重复它(如果重要的话,在contentplaceholder中。布局由主页控制)每个实例的值是否不同?

public static string getShortPosts(int postNumber)
{
    DbConnection d = new DbConnection();
    DataTable tbl = d.selectQuery("SELECT TOP (" + postNumber + ") news.id, news.title, news.newsContent, news.excerpt, news.date, news.userid, news.urlTitle, " +
                                    "news.isPublished, users.firstName, users.lastName FROM news INNER JOIN users ON news.userid = users.userid " +
                                    "ORDER BY id DESC;");
    DataTableReader r = tbl.CreateDataReader();

    StringBuilder s = new StringBuilder("");

    while (r.Read())
    {
        /* THIS */ 
        s.Append(
            "<div class=\"newsBox\">" + System.Environment.NewLine +
            "<h2>" + r["title"]+ "</h2>" + System.Environment.NewLine +
            "<p>" + r["excerpt"] + "</p>" + System.Environment.NewLine +
            "</div>" +System.Environment.NewLine+System.Environment.NewLine
            );
    }

    return s.ToString();
}

3 个答案:

答案 0 :(得分:1)

如果是我,我会创建一个专用于在列表中创建单个条目的用户控件。用户控件只需要一个参数(它负责的帖子编号)。页面本身只需要维护这些用户控件的数组(或列表或您喜欢的任何结构),并将它们添加到需要动态显示的任何面板中。

用户控件将包含一个带有“newsBox”类的面板,一个标题的标签,以及另一个面板(或者可能只是一个常规的HTML段落),因此它的输出与你在你的内容中构建的相同。例。区别在于它将使用ASP和HTML对象而不是字符串创建。

另外,如果是我,我将没有用户控件负责从数据库查询自己的数据。 DAL在这里真的很有用,因为你可以有一个函数“GetNewsDetails(int postNumber)”,它可以缓存新闻帖子,如果他们最近被查询过,并且必要时可以被其他用户控件重用。

答案 1 :(得分:1)

有趣的问题。

我认为你可以构建和.xslt trasformation文件,应用于xml源将生成你需要的html。

因此,在您的页面中,您必须只有一个asp:Xml控件:

<asp:Xml ID="xmlMyControl" runat="server" />

在后面的代码中,您必须应用转换加载正确的xslt文件:

XslTransform xslt = new XslTransform();
xslt.Load(Server.MapPath("~/myTransformationFile.xslt"));

xmlMyControl.Transform = xslt;

xmlMyControl.DocumentContent = myMethodToRetrieveXML(); // Your source data, return xml as a string
xmlMyControl.DataBind();

我在你的代码中看到你有一个DataTable作为数据源,但我认为将它转换为xml字符串没问题。

通过这种方式,您将只有一个模板(.xslt文件),并且您在其上应用的所有更改将自动反映您使用它的任何位置。

答案 2 :(得分:1)

我会建议模板化的用户控件。网上有很多教程;这是关于此事的msdn文章:http://msdn.microsoft.com/en-us/library/aa478964.aspx

  

在本文中,我们研究了如何使用   创建一个非数据绑定自定义ASP.NET   使用该服务器的服务器控件   一个模板。意识到这一点   控制可以扩展到提供   多个模板,很像是如何   DataList提供了大量的功能   模板。我们添加了模板支持   通过以下步骤:

     
      
  • 在DisplayStats中创建ITemplate类型的私有成员变量   控制类。
  •   
  • 为模板创建了一个公共读写属性语句。
  •   
  • 创建了一个间接从Control类派生的类(StatsData)   提供了我们想要的属性   允许页面开发人员访问   模板通过数据绑定语法。
  •   
  • 覆盖CreateChildControls()方法。这种方法清除了   控件集合,创建了一个   然后是StatsData的实例   实例化了StatsData实例   模板,最后添加了   控件的StatsData实例   集合。
  •   
  • 覆盖DataBind()方法,该方法调用CreateChildControls()   方法
  •   

使用模板化控件,您可以拥有类似于带有转发器项目的转发器的自己的设置。您可以在哪里公开DataItem并在前端写入所有标记。它也相当设计友好。然而,巨大的成本是增加的复杂性。我肯定会保留它用于重要或高度可重复使用的控件。