2011-06-07 208 views
6

我在C#2.0中使用ASP.NET。我为数据库创建了一些对象,并且这些对象中的每一个都具有可以本地调用的属性或者以类似方式调用的属性,并从它们创建一个JSON API。服务器端和客户端方法

我有很多标签式的东西,我喜欢在这个网站上调用'模块' - 模块的功能是将数据转换为HTML以显示在页面上。理想情况下,这需要在服务器端C#代码中加载第一个选项卡,然后在单击选项卡时使用Ajax加载其他选项,但对于旧的浏览器和搜索引擎,选项卡仍然是一个链接,将加载相同的HTML代码服务器端。

目前我写的JavaScript代码完全独立于将每个模块转换为HTML的C#代码,但方法实际上是相同的,只是一种不同的语言。类似于这个例子。

C#代码

public override string GetHtml() 
{ 
    IJsonObjectCollection<Person> response = ((Village)page).People; 
    string html = "<div id=\"test\">"; 
    foreach (Person person in response) 
    { 
     html += "<div class=\"person\">"; 
     html += person.Name; 
     if(canEdit) html += "*"; 
     html += "</div>"; 
    } 
    return html + "</div>"; 
} 

JavaScript代码

function getHtml() { 
    JsonRequest('/json/villages/1/people', function(response) { 
     var html = '<div id="test">'; 
     for (int i = 0; i < response.length; i++) 
     { 
      var person = response[i]; 
      html += '<div class="person">'; 
      html += person.name; 
      if(canEdit) html += '*'; 
      html += '</div>'; 
     } 
     return html + '</div>'; 
    }); 
} 

你或许可以看到我这个问题去。什么是最有效的方法呢?我正在考虑一些不同的选择 -

1.每个ModuleToHtmlMethod可能是一个类,它定义将此数据对象转换为HTML的方法。我试过这个,但因为太复杂,我停下了。

2.写我自己的脚本语言,可以解释为C#,但也编译成JavaScript代码。

只要写在C#中的很多,使用Ajax简单地请求从C#

4. HTML内容保持分离的代码,写的每一个方法的两倍。

我想最终让其他开发人员编写这些'模块',所以也许选项是最好的选择?

回答

1

我会放弃选项4,因为它会使维护变得更加困难,并且最终可能会导致通过Javascript生成的HTML和C#代码生成的HTML之间不同步。我也会放弃选项2,因为这可能会使代码对其他开发人员更加困难,也可能不必要。

我肯定会在一个地方生成HTML,可能会公开使用C#存在函数返回HTML片段的RESTful HTML API。所以从你的Javascript你可以打电话:

function getHtml() { 
    MyHtmlRequest('/html/villages/1/people', function(response) { 
     var html = response.Text; 
     return html; 
    }); 
} 
+0

我想,这可能是最好的一段路要走。这里的问题是大部分代码都是循环的(可能很大),所以大部分的html都会重复使用,这会大大增加响应的大小。 gzip压缩会帮助我吗? – Connell 2011-06-07 09:46:07

+0

使用gzip你应该减少50-70%的响应大小,这是你的电话,看看这是否可以接受。您应该使用JSON RESTful API和HTML RESTful API来计算相同响应之间的字节差异。如果差异小于50%,gzip肯定会解决标记开销。 – 2011-06-07 14:11:31

+0

我不需要测试它来告诉你它需要额外超过50%。有些循环通常循环10-20次,但可能会延长到50个循环,具体取决于所调用的数据类型。然后,html代码类似于“

'+row.name+' Edit
”或类似的代码。通常更多的HTML,也许是一个删除按钮。 – Connell 2011-06-08 08:21:49

1

一些建议。

  • 有一个反映html的泛型GetHtml方法。这可能很难,因为用户界面不是简单而统一地映射到数据字段的东西。
  • 有你的“模块”元描述,用它来创建通用GetHtml方法
  • 最后try this:它将使你刚刚创建的JavaScript方法,那么你就可以从C#

打电话给他们我会去第二个元描述选项,因为这是我为我的数据层做的。我基本上有一个文件定义我的领域模型。我使用它来生成所有数据acccess pocos,nhibernate配置文件等。然后我有一个元数据文件,它将信息添加到这些对象中,如UI渲染信息和字段验证信息。

TNX

圭多

+0

在第二个选项中,你的意思是一个人类可读的描述,它允许用多种语言编写完全相同的函数,或者可以用类似于我的第二个选项的机器可读描述? – Connell 2011-06-08 08:15:32

+0

我的意思是一个代码生成器。所以你定义一个'描述文件',然后生成你所有的getHtml方法。所以基本上,最后发生的是你在DSL中描述你所有的模块(xml或json很好,你可能想看看[T4](http://msdn.microsoft.com/en-us/library/bb126445)。 ASPX))。所以是的,它就像你的选择2,但它比编写你自己的脚本语言简单得多。 – gatapia 2011-06-09 00:08:19

+0

嗯..我可以看到这是如何与JavaScript的作品。一旦它生成C#代码,我是否简单地将代码复制到C#代码中?或者我会用一些奇特的方式来解释这个定义,或者编译它? – Connell 2011-06-10 08:18:08