1

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

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

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

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


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

String : Name
Int : Age
Complex Type : Address (包括 Street, City, Zip)
Array of Type "Qualification" : Qualifications (包括学位, Passing Year, Grades)

期望的输出是:

<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 元素属性等),然后执行转换。

4

2 回答 2

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,因为它更容易在不重新编译的情况下进行更改。而你最复杂的渲染部分是渲染你的容器标签,因为你保留了对象数组。如果您为它们实现了一个 Collection 类,那么您可以改为在该类中维护 Container 标签。

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

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

于 2009-12-25T23:34:52.143 回答
0

我将其视为一个设计问题,并从更高的角度详细回答,即设计而不是代码!正确的方法如下。

  • Person 类型保存信息并且以数据为中心,因此我建议不要将任何 html 渲染责任放入此类。

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

  • 因此,您应该开始编写派生自 System.Web.UI.WebContorl 的服务器控件。在其 set 访问器中公开一个采用 BusinessBase 类型对象的属性。

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

  • 回到您的 web-server-control 并通过使用反射来遍历已分配给 BusinessBase 类型的服务器控件属性的对象的所有属性 [具有您的自定义属性]。根据属性渲染 html

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

这是一个高水平的设计。对于为业务对象生成的 html 呈现方式,您需要在属性中更加离散和具体。

于 2009-12-26T12:01:46.613 回答