服务器端和客户端方法
Posted
技术标签:
【中文标题】服务器端和客户端方法【英文标题】:Server side and client side method 【发布时间】:2011-09-09 21:59:30 【问题描述】:我正在使用带有 C# 2.0 的 ASP.NET。我为数据库创建了一些对象,每个对象都具有可以本地调用或以类似方式调用的属性,并从中创建RESTful 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 代码。
3. 只需用 C# 编写大量内容,然后使用 Ajax 简单地从 C# 请求 HTML 内容
4.保持代码分开,每个方法写两次。
我希望最终允许其他开发人员编写这些“模块”,所以也许选项 2 是最好的选择?
【问题讨论】:
【参考方案1】:我会放弃选项 4,因为它会使维护变得更加困难,并且您最终可能会在通过 Javascript 生成的 HTML 和来自 C# 代码的 HTML 之间不同步。我也会放弃选项 2,因为这可能会使代码对其他开发人员来说更加困难,也可能是不必要的。
我肯定会在一个地方生成 HTML,并可能公开使用 C# 现有函数返回 HTML sn-ps 的 RESTful HTML API。所以从你的Javascript你会打电话:
function getHtml()
MyHtmlRequest('/html/villages/1/people', function(response)
var html = response.Text;
return html;
);
【讨论】:
我认为这可能是最好的方法。这里的问题是大部分代码都在循环中(可能非常大),因此大部分 html 将被重复,这将大大增加响应大小。 gzip 压缩对我有帮助吗? 使用 gzip 你应该削减 50-70% 的响应大小,你可以打电话来看看这是否可以接受。您应该使用 JSON RESTful API 和 HTML RESTful API 计算相同响应之间的字节差异。如果差值小于 50%,gzip 肯定会解决标记开销。 我不需要测试它就可以告诉你它需要多出 50% 以上。有些循环通常会循环 10-20 次,但可能会扩展到 50 次,具体取决于调用的数据类型。然后html代码类似于'<div id="myrow'+i+'" class="myrow"><img src=".imgs/'+row.img+'.png" /> '+row.name+' <a href="blah" onclick="edit('+i+')">Edit</a></div>
或类似。通常更多的 HTML,也许是删除按钮。【参考方案2】:
几个建议。
具有反映 html 的通用 GetHtml 方法。这可能很困难,因为 UI 不能轻松统一地映射到数据字段。 拥有你的“模块”的元描述,用它来创建你的通用 GetHtml 方法 最后try this:它只允许你创建 JavaScript 方法,然后你可以从 C# 调用它们我会选择第二个元描述选项,因为这是我为我的数据层所做的。我基本上有一个定义我的域模型的文件。我用它来生成我所有的数据访问 pocos、nhibernate 配置文件等。然后我有一个元数据文件,它向这些对象添加信息,如 UI 呈现信息和字段验证信息。
Tnx
圭多
【讨论】:
在您的第二个选项中,您是指允许人们用多种语言编写完全相同的功能的人类可读描述,还是可以以与我的第二个选项类似的方式使用的机器可读描述? 我的意思是代码生成器。因此,您定义了一个“描述文件”,然后生成所有 getHtml 方法。所以基本上最终发生的事情是你在 DSL 中描述你的所有模块(xml 或 json 很好,你可能想看看T4)。所以是的,它就像您的选项 2,但它比编写自己的脚本语言要简单得多。 嗯.. 我可以看到它是如何与 javascript 一起工作的。生成 C# 代码后,我是否只需将代码复制到 C# 代码中?或者我会有什么奇特的方式来解释或编译这个定义? 不,您定义一个定义文件,描述您的 getHtml 方法将如何工作,然后生成 C# 和 JavaScript 实现。 对不起,这不是一个是/否的问题。我仍然对这里模棱两可的术语感到困惑..“你生成”是否意味着我必须同时编写两者,或者我称之为为我生成代码的其他东西?如果它生成 C# 代码,我是否必须在每次更改并重新编译时手动粘贴它?以上是关于服务器端和客户端方法的主要内容,如果未能解决你的问题,请参考以下文章