服务器端和客户端方法

本文关键字:方法 客户端 服务器端 | 更新日期: 2023-09-27 17:58:29

我使用的是带有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可能是最好的选择?

服务器端和客户端方法

我会放弃选项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;
    });
}

几个建议。

  • 有一个反映html的通用GetHtml方法。这可能很困难,因为UI并不是一个容易且统一地映射到数据字段的东西
  • 有一个"模块"的元描述,用它来创建通用的GetHtml方法
  • 最后尝试一下:它只允许您创建JavaScript方法,然后您可以从C调用它们#

我会选择第二个元描述选项,因为这是我为数据层所做的。我基本上有一个定义我的域模型的文件。我用它来生成我的所有数据访问pocos、nhibernate配置文件等。然后我有一个元数据文件,它向这些对象添加信息,比如UI渲染信息和字段验证信息。

Tnx

Guido