在ASP.Net中将数据对象转换为HTML的简单机制

时间:2009-12-25 18:54:28

标签: html asp.net object transform

我正在寻找一种将数据对象转换为HTML的机制。数据对象中的元素既有简单类型,也有复杂类型。我曾尝试使用HtmlTextWriter进行渲染,但遇到了复杂的类型。

我是一个ASP.Net网站项目。我必须避免使用服务器端控件(因此取消内置绑定功能),因为前端处理是在jQuery的帮助下完成的。我需要为我的数据对象生成基本的HTML,其余的丰富(内容安排和样式)将在前端完成。

我正在寻找一个简单的解决方案(我发现Spring.Net是一种过度杀伤和压倒性的,NHAML也非常混乱)。

此外,我的应用程序预计会在一段时间内增长,因此我需要对性能有所尊重。因此,我避免在图片中引入XML / XSLT。


例如。 Person 对象将是这样的:

字符串:名称
Int :年龄
复杂类型:地址(包括街道,城市,邮编)
类型数组 “资格认证”:资格(包括学位,通过年级,成绩)

所需的输出是:

<p id="userName" class="userName">John</p>
<p id="age" class="age">35</p>
<div id="address" class="address">
    <p id="street" class="street">Express Highway</p>
    <p id="city" class="city">Mumbai</p>
    <p id="zip" class="zip">400101</p>
</div>
<div id="qualifications" class="qualifications">
    <div id="qualification1" class="qualification">
        <p id="degree1" class="degree">B.Sc.</p>
        <p id="year1" class="year">1990</p>
        <p id="grade1" class="grade">A</p>
    </div>
    <div id="qualification2" class="qualification">
        <p id="degree2" class="degree">M.Sc.</p>
        <p id="year2" class="year">1992</p>
        <p id="grade2" class="grade">A</p>
    </div>
</div>

这里需要注意的是,映射器需要映射源数据对象的属性,向其添加一些元数据(如HTML元素属性等),然后执行转换。

2 个答案:

答案 0 :(得分:0)

您是否已将XmlSerializer或DataContractSerializer(更快)与xslt转换一起进行基准测试,因为您已将它们从蝙蝠中解雇了?

如果仍然认为xslt对于服务器来说太慢,请让客户端将其呈现为xhtml。然后将cpu“负担”分发给所有用户。

可以在w3schools.com找到教程。

考虑未来的扩展是明智的,但在你真正知道它将成为瓶颈之前,你不应该忽视一个明显的技术和解决方案。

与进行更复杂的编程路由相比,您还应计算添加其他前端服务器的成本。您还可以查看缓存以提高性能。

[编辑] 另一个解决方案是为每个类实现一个WriteHtml方法,并从您的顶级类中调用所有的子编写器。手动和有效(但需要更多管理,因为如果添加属性必须更新编写器)。

class Person
{
   public void WriteHtml(Stream writeStream);
   {
     writeStream.Write( "<p id="userName" class="userName">{0}</p>", UserName );
     etc.
     Adress.WriteHtml(writeStream);
     writeStream.Write( "<div id="address" class="address">" );
     foreach( Address ad in Adresses ) ad.WriteHtml(writeStream);
     writeStream.Write( "</div>" );
   }
}

您还可以在每个类中重写ToString()以返回html表示,然后使用它。

由于你声明类很简单,它应该是可维护和可读的,但我仍然喜欢xslt,因为它更容易更改而无需重新编译。最复杂的渲染部分是渲染Container标签,因为你保留了对象的数组。如果您为它们实现了Collection类,那么您可以在该类中维护Container标记。

class Person
{
   AddressCollection Adresses;
   // instead of
   Adress[] Adresses;
}

然后问题是,你认为“简单”是什么:D

答案 1 :(得分:0)

我将它视为一个设计问题,并在更高的视角下进行精心设计,而不是代码!正确的方法如下。

  • 人员类型正在保留信息,并且以数据为中心所以我建议不要提出任何HTML渲染责任进入这个班级。

  • 首先,您需要为所有业务/数据对象提供抽象基类。让我们假设[因为你需要拥有它] BusinessBase

  • 所以你应该开始编写一个派生自System.Web.UI.WebContorl的服务器控件。在其set访问器中公开一个带有BusinessBase类型对象的属性。

  • 现在您需要定义一些自定义属性,该属性应用于BusinessBase类型的任何子类的属性。此属性保存业务/数据对象的特定属性的渲染输出信息。 装饰您希望在html中呈现的所有属性

  • 回到您的网络服务器控件并使用反射来遍历已分配给服务器控件属性的所有属性[具有您的自定义属性] 的对象键入BusinessBase。 根据属性呈现html。

现在在asp.net前端使用这个web-server-control和业务对象。玩得开心。

  

这是一个高级设计。你需要更加离散和   具体在你的属性中是什么   生成html渲染   业务对象。