服务器端和客户端方法

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代码类似于'&lt;div id="myrow'+i+'" class="myrow"&gt;&lt;img src=".imgs/'+row.img+'.png" /&gt; '+row.name+' &lt;a href="blah" onclick="edit('+i+')"&gt;Edit&lt;/a&gt;&lt;/div&gt;或类似。通常更多的 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# 代码,我是否必须在每次更改并重新编译时手动粘贴它?

以上是关于服务器端和客户端方法的主要内容,如果未能解决你的问题,请参考以下文章

mysql5.5以上版本修改字符集服务器端和客户端字符集的方法

Java 服务端和客户端的通信

java中TCP服务端和客服端通讯

webService服务端和客户端开发 简单实例

tcp 服务端和客户端程序设计

TCP服务器端和客户端程序设计