Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在asp.net中为数据创建重复模板的好方法_Asp.net_Templates - Fatal编程技术网

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

在asp.net中为数据创建重复模板的好方法,asp.net,templates,Asp.net,Templates,我正在构建一个网页,在该网页的首页上显示n条最新的新闻帖子,这是获取帖子并将其返回到.aspx文件的方法。我使用asp:substitution控件将字符串插入网页 我认为我这样做的方式有点凌乱和丑陋,如果我想在模板上做一些小的修改,就不是很灵活。在将模板本身放在单独的.aspx或.ascx文件中时,有什么方法可以实现我想要的吗?我已经试过了,但是想不出一个聪明的方法将数据处理到模板文件中 另外,什么时候?我已经将模板放在一个单独的文件中——如果有必要,我如何在contentplaceholde

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

我认为我这样做的方式有点凌乱和丑陋,如果我想在模板上做一些小的修改,就不是很灵活。在将模板本身放在单独的.aspx或.ascx文件中时,有什么方法可以实现我想要的吗?我已经试过了,但是想不出一个聪明的方法将数据处理到模板文件中

另外,什么时候?我已经将模板放在一个单独的文件中——如果有必要,我如何在contentplaceholder中的另一个.aspx文件中重复它。布局由母版页控制,每个实例具有不同的值

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();
}

如果是我,我将创建一个用户控件,专门用于在列表中创建单个条目。用户控件只需要一个参数,即它负责的post编号。页面本身只需要维护一个数组或列表,或者您希望这些用户控件的任何结构,并将它们添加到需要动态显示的任何面板中。 用户控件将包含一个带有类newsBox的面板、一个标题标签和另一个面板,或者可能只是内容的常规HTML段落,因此其输出将与您在示例中构建的内容相同。区别在于它将使用ASP和HTML对象而不是字符串创建。 而且,如果是我,我就不会有一个用户控件负责从数据库查询自己的数据。DAL在这里非常有用,因为您可以使用函数GetNewsDetailsint postNumber来缓存最近查询过的新闻帖子,如果需要,还可以被其他用户控件重用。

有趣的问题

我认为您可以构建和.xslt转换文件,该文件应用于xml源将生成所需的html

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

<asp:Xml ID="xmlMyControl" runat="server" />
我从代码中看到,您有一个DataTable作为数据源,但我认为将其转换为xml字符串并没有问题


通过这种方式,您将只有一个template.xslt文件,您对其应用的所有更改将自动反映在您使用它的任何地方。

我建议使用模板化用户控件。网上有很多教程;以下是msdn关于这一问题的文章:

在本文中,我们研究了如何 创建非数据绑定的自定义ASP.NET 使用 模板的定义。认识到 可以扩展控制以提供 多个模板,很像 DataList提供了大量 模板。我们添加了模板支持 通过采取以下步骤:

在DisplayStats中创建ITemplate类型的私有成员变量 控制类。 已为模板创建公共读写属性语句。 创建了一个类StatsData,该类间接派生自 提供我们想要的财产 允许页面开发人员在中访问 通过数据绑定语法创建模板。 重写CreateChildControls方法。此方法清除了 控件集合,创建一个 StatsData的实例,然后 在中实例化StatsData实例 模板,最后添加 将StatsData实例添加到控件 收集 重写DataBind方法,该方法调用CreateChildControls 方法
使用模板控件,您可以拥有自己的设置,类似于带有中继器项的中继器。您可以在其中公开数据项并在前端写入所有标记。它也是相当友好的设计师。然而,一个巨大的代价是复杂性的增加。我肯定会把它保留给重要的或高度可重用的控件。

啊,好主意。可能只是调查一下。
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();