1

我们正处于将 Script# 引入我们的项目的早期阶段,到目前为止,我们喜欢我们所看到的。但是,对于将脚本添加到单个页面/视图的最佳策略,我有点困惑。

总之,我们的 asp.net mvc 项目有很多控制器,也有很多视图。这些视图中的每一个都为我们的应用程序的一部分提供了不同的功能。

如果您以这种方式进行设置,似乎 Script# 确实提供了为不同文件夹输出许多不同脚本的能力,但我在 StackOverflow 上的其他地方看到了回应,表明这种方法不受欢迎。

我能看到的拥有每页脚本的唯一另一种方法是在$(Document).Ready()调用脚本中与视图名称或类似名称匹配的方法时触发每个视图的方法调用。这会起作用,但我不太喜欢这个想法。

其他人如何处理这个问题?

4

1 回答 1

1

我相信有两个动机(通常基于之前关于该主题的对话)

  1. 每页都有ac#项目太痛苦了。
  2. 您希望最小化每个页面中加载的脚本数量。

为了解决#1,曾经有一个解决方案可以将单个 c# 项目编译成位以生成多个脚本,但现在已经不存在了。它消失的原因是,由于 c# 编译器一次编译一个完整的项目,而 script# 一次编译项目的一部分,因此很容易拥有不同的语义。然而,一切都没有丢失 - 你有几个选择。

  • 自定义 msbuild 过程 - 专门更改 csproj 以使用代码子集多次调用 ScriptCompilerTask。您负责确保每个代码子集都能成功编译,因为 c# 编译器提供的验证意义不大。

  • 使用 Script# 编译器 API 编写自定义 msbuild 任务。您可以在 github [1] 的 script# 存储库中看到 msbuild 任务的实现,并以此为基础……您甚至可以回顾源代码的历史,了解 msbuild 任务是如何提供此功能的。

要解决 #2,最好根据您的应用场景考虑哪些有意义的脚本集并以这种方式加载它们,而不是每页严格地一个特定的脚本文件(一旦考虑到缓存、http 请求等)。 )。

因此,假设您将多个页面的脚本组合成一个脚本。现在解决您在给定页面的情况下加载正确脚本的问题。这是我所做的:

在我的页面中,我这样注释 body 标签:

<body id="editPage">

在我的脚本#中,我有以下内容:

internal static class EditPage {

    static EditPage() {
        jQuery.OnDocumentReady(delegate() {
            if (Document.BodyElement.ID == "editPage") {
                // Code you want to run on editPage
            }
        });
    }
}

有多种方法可以实现这一点,但您不必严格地在每个页面中编写一点代码来调用正确的 API。希望这可以让您了解脚本中所有逻辑自包含的替代方案。

script# 中的一个示例(请参阅https://github.com/nikhilk/scriptsharp/blob/cc/samples/AroundMe/AroundMe/Page.cs#L38)执行类似于有条件运行代码的操作。

这样做的一个很好的副作用是您的大部分代码都可以转换为内部类,因为视图永远不会直接调用脚本。而是脚本以不显眼的方式向页面添加行为。好处当然是大大增加了脚本的最小化。

[1] https://github.com/nikhilk/scriptsharp

于 2013-03-29T00:27:07.660 回答