C#和Javascript中避免重复代码的想法有哪些?

9
我有一个ASP.NET MVC网站,其中我使用C#构建大部分页面,例如根据我的视图模型中的数据构建HTML表格。
我还有很多JavaScript代码动态修改这些表格(例如添加行)。
添加新行的JavaScript代码看起来与我用于首次构建HTML表格的C#“渲染”代码非常相似。
每当我更改C#代码以添加新字段时,我都必须记住返回JavaScript代码进行相同的更改。
这里是否有更好的方法?
3个回答

8

一种做法是将生成标记的逻辑作为 Web 服务暴露在服务器上,并通过 AJAX 调用使 JavaScript 获取该标记,而不是复制逻辑。

这样,您可以从 JavaScript 中调用类似于 CreateRow 方法的东西,实际上会调用在渲染页面时使用的完全相同的逻辑。


这是一个很棒的想法。相对于已经在客户端上存在的代码,可能会慢一些,但绝对能够去除冗余,达到了工作的目的。 - leora

0
与@Andrew Hare所接受和流行的答案相反,我更愿意仅在javascript中实现标记生成(并重用它来构建HTML表格),而不是仅在C#中实现标记(如果javascript也需要这个功能的话,当然)。
原因如下:
1. 对于HTML,javascript比C#更好,因为它可以修改已呈现的DOM。因此,使用javascript,您可以做更多事情,而不仅仅是静态HTML。也许现在您不需要它,但现在很常见的要求是将应用程序变得更像是一个丰富的互联网应用程序。 2. AJAX调用往往比最差的处理服务器端数据并将其转换为现有表格的Javascript实现更慢。与使用javascript从头开始创建表格相比,也更慢。 3. 减少服务器请求(以及更多客户端需求,但通常不是问题)。 4. 有几个非常好的Javascript框架可以创建漂亮的表格(以及其他更多功能)。
我知道ASP.NET MVC有很多关于如何使用HTML助手的好例子,可以帮助您进行干净且快速的开发。但是,如果您最终还是要创建javascript函数,那么我认为您应该重新考虑关注点的分离,并坚持使用javascript且丢弃HTML助手中的重复代码。

如果你已经在创建行,那么扩展你的Javascript函数以创建整个表格应该不难。这里有一个将数据传递给Javascript并使用你已经拥有的"createRow"函数的想法:

<script>
    var data = [];
    <% foreach (var item in Model) { %>
        data.push({
            Id: <%= Html.Encode(item.Id) %>
            , Title: <%= Html.Encode(item.Title) %>
        });
    <% } %> 
    createTableHeader();
    for (var i = 0; i < data.length; i++) {
        createRow(data[i]);
    }
    createTableFooter();
</script>

0

看看 Scott Gu 的文章:ASP.NET MVC 2: Model Validation

基本上,您可以在模型属性级别定义验证,而 ASP.NET MVC 2 可以自动生成适当的客户端验证。

不幸的是,这可能意味着您需要将所有内容重构为 MVC,但很多人可能会将其视为加分项。

(免责声明:我根本没有使用过 ASP.NET MVC)


我的代码与重复验证无关,它更多地是构建HTML。 - leora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接