用C#对象属性值替换html模板中的项目

时间:2011-03-06 18:03:19

标签: c# asp.net html templates

1:我有一个.html文件,其中包含一些带有一些占位符标记的标记。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
   First Name : <FIRSTNAME/>   <br />
   Last Name:  <LASTNAME/>
</body>
</html>

2:我有一个Class来保存从db

返回的数据
public class Person
{
    public Person()
    {
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

3:PersonInfo.aspx我写出这个.html,占位符替换为实际值。

public partial class PersonInfo : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Person per= new Person();
        per.FirstName = "Hello";
        per.LastName = "World";

        string temp = File.ReadAllText(Server.MapPath("~/template.htm"));
        temp = temp.Replace("<FIRSTNAME/>", per.FirstName);
        temp = temp.Replace("<LASTNAME/>", per.LastName);
        Response.Write(temp);
    }
}

4:PersonInfo.aspx实际上是空的,因为我从代码隐藏中注入了html。

当调用PersonInfo.aspx时,将显示带有占位符中适当值的html-template标记。还有机会我想在html电子邮件中发送最终标记(虽然这不是问题的一部分,因为我知道如何发送电子邮件)。

这是填写我的html模板中值的最佳方法,还是其他更好的选择?

注意:这是一个非常简单的示例示例。我的类非常复杂,涉及对象作为属性,我的html模板也有40-50个占位符。

因此,我的第3步中的代码将需要40-50个替换语句。

随意询问是否有任何疑问,并非常感谢任何投入。

4 个答案:

答案 0 :(得分:3)

如果您的页面是有效的XML(因为我猜它是基于该示例),那么您可以将其解析为XElement并按节点名称进行后代搜索。你可以写一个更有效的版本,但一个例子是:

.NET 3.5

    public void Page_Load(object sender, EventArgs e)
    {
        Person person = new Person { FirstName = "Hello", LastName = "World" };
        var dictionary = typeof(Person).GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .ToDictionary(p => p.Name.ToUpperInvariant(), p => (p.GetValue(person, null) ?? string.Empty).ToString());
        var xe = XElement.Parse(File.ReadAllText(HttpContext.Current.Server.MapPath("~/template.htm")));
        foreach (var key in dictionary.Keys)
        {
            foreach (var match in xe.Descendants(key))
            {
                match.ReplaceAll(dictionary[key]);
            }
        }
    }

.NET 2.0友好:

        var person = new Person();
        person.FirstName = "Hello"; 
        person.LastName = "World";
        var dictionary = new Dictionary<string, string>();
        foreach(var propertyInfo in typeof(Person).GetProperties(BindingFlags.Public|BindingFlags.Instance))
        {
            var elementName = propertyInfo.Name.ToUpperInvariant();
            var value = (propertyInfo.GetValue(person, null) ?? string.Empty).ToString();
            dictionary.Add(elementName,value);
        }
        var xml = new XmlDocument();
        xml.LoadXml(File.ReadAllText(HttpContext.Current.Server.MapPath("~/template.htm")));
        foreach(var key in dictionary.Keys)
        {
            var matches = xml.GetElementsByTagName(key);
            for(int i = 0; i<matches.Count;i++)
            {
                var match = matches[i];
                var textNode = xml.CreateTextNode(dictionary[key]);
                match.ParentNode.ReplaceChild(textNode, match);
            }
        }

答案 1 :(得分:1)

我会将您的页面更改为使用xslt。这是从数据库中替换事物的一种非常简单的方法。您需要做的唯一工作就是使用数据库中的数据制作XML文档。

答案 2 :(得分:1)

我会使用SqlDataSource和Repeater控件。它们使您可以非常轻松地从数据库中提取数据,然后将其显示在页面上。您不需要执行任何代码隐藏,因为.NET将为您处理所有内容。

您的数据源看起来像这样:

<asp:sqlDataSource ID="mySqlDataSource" SelectCommand="SELECT firstName, lastName FROM tablename" />

然后你需要一个可以使用返回数据的控件并将其显示在页面上:

<asp:Repeater runat="server">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>First Name: <%#Container.DataItem("firstName")%>"</td>
        </tr>
        <tr>
            <td>Last Name: <%#Container.DataItem("lastName")%></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

编辑:

由于您不想使用数据源和数据绑定控件,我建议使用XmlTextWriter类。有一个very good tutorial here。这将使您比从单独的HTML文件中读取模板更灵活。

答案 3 :(得分:1)

由于您要生成电子邮件,请考虑使用MailDefinition.CreateMailMessage。您必须将占位符和替换值复制到Dictionary对象。