我正在构建一个网页,我在首页上显示 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();
}
答案 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并在前端写入所有标记。它也相当设计友好。然而,巨大的成本是增加的复杂性。我肯定会保留它用于重要或高度可重复使用的控件。