问题 将TypeScript与内联服务器端``块和ASP.Net一起使用


我希望能够在ASPX(或Razor)页面中使用内联TypeScript,该页面在页面编译时转换为Javascript。

所以:

<script type="text/typescript" runat="server">
    ...
</script>

成为...

<script type="text/javascript">
    ...
</script>

它应该发生在同一点上 @ 要么 <% %> 块被转换。

这应该可以在运行时使用某种页面后处理,但在编译时不会产生异常 - 我想在脚本中找到与任何C#代码同时出错的错误。

理想情况下,TypeScript intellisense等应该在内联中工作 <script> 块,这让我觉得这应该是VS2012扩展。

有没有办法做到这一点?


8938
2017-11-21 15:49


起源

+1令人敬畏的主题 - EdSF


答案:


最简洁的答案是不。

您可以编写一个TypeScript文件并粘贴已编译的JavaScript,但这样就可以了。一个实际问题是,如果编译器将您的TypeScript转换为JavaScript,您将丢失TypeScript代码。这就是您拥有TypeScript文件和JavaScript文件的原因。

将脚本内联而不是引用外部脚本的令人信服的理由是 - 您的问题可能有另一种解决方案,不需要内联脚本吗?


5
2017-11-21 17:12



为什么?我不会丢失一个内容 <% %> 要么 @{ } 块。我使用内联块的原因相当长,在这里有点偏离主题。 - Keith
@keith <%和%>的内容在运行时保持不变。它没有改变。你错过了这一点。 - x0n
@ x0n ASP.Net肯定会编译,虽然取决于配置,它可以编译JIT(当第一个用户访问ASPX页面时)或提前编译(导致每个ASPX页面被缩减为空占位符)。的内容 <% %> 不在浏览器中输出,但也可以由编译器拾取并在VS中发出警告。我希望TS块的行为类似于a的特殊情况 <% %> 块。 - Keith
如果问题是“这可以做到”答案是否定的 - 没有办法做到这一点。如果问题是“可以这样做” - 它可能是,虽然您需要在服务器上运行的编译器的实现以及将字符串传递给它并输出结果的东西。您还需要扩展Visual Studio以对文本块执行静态分析,否则您将无法在设计时进行任何类型检查。 - user75525
@Keith我不是说Visual Studio不这样做。我说什么都没有。不是Visual Studio,不是Web Essentials,不是替代插件。没有什么可以做到的。如果你写了一个插件 - 它将是第一个! - user75525


您可以创建一个服务器控件,在运行时编译代码并缓存它:

[DefaultProperty("Text")]  
[ToolboxData("<{0}:TypeScript runat=server></{0}:TypeScript>")]  
public class TypeScript : WebControl  
{  
    public string Text { get; set; }

    protected override void RenderContents(HtmlTextWriter output)  
    {  
        output.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");  
        if (!string.IsNullOrEmpty(this.ID))
        {
            output.AddAttribute(HtmlTextWriterAttribute.Id, this.ID);  
        }
        output.RenderBeginTag("script");
        output.Write(CompileToJavaScript(Text));
        output.RenderEndTag();
    }

    private string CompileToJavaScript(string typeScript)
    {
        // TODO: Call tsc with the code, and return the result.
    }
} 

您可以使用JScript.NET编译tsc.js,如果您需要实现IO层,并清除一些JScript.Net(非JavaScript)语法错误。


3
2017-11-22 00:51



+1和我喜欢这个想法,但它有两个问题:TS的编译将是运行时(如我的后处理器想法),失去了很多TS的优点。对于VS2012,控件的内容也只是纯文本。 - Keith


  • 有一个解决它的方法,我所做的是在脚本标记中声明razor所需的变量

    <script type="text/javascript">
    
    //Razor variables initialized here and declared in the TypescriptFile.ts file
    
    var url = "@Url.Action("NewRequest", "Request")";
    
    </script>
    
  • next声明Typescript文件中的url变量

    //TypescriptFile.ts
    declare var url: string;
    alert(url);
    
  • 用它

  • 很遗憾看到Visual Studio 2013仍然不提供服务器端支持。


2
2018-01-20 18:16



干杯,但这不是我所要求的。我想在页面服务器端内联解析TypeScript代码块,而不是在Javascript中包含代码块。 - Keith
干杯基思,感谢评论。当然,我明白你想要什么,也需要它,但是根据 channel9.msdn.com/Events/Build/2013/9-006,现在似乎没有发生,也许很快就会发生。我发布了这个答案,因为人们有时会阅读这个帖子有这样的要求,这可能会有所帮助:) - Rohit Tidke


虽然它不是您问题的真正解决方案,但为什么不将TypeScript代码保留为原样 <script type="text/typescript"> 并使用 打字稿编译 让它在运行时编译?


0
2017-11-28 01:52



因为那时你没有得到TS的编译时优势,并且为用户添加了大量的JS库/编译开销。你得到了所有问题而没有任何优势。 - Keith