C# 将TypeScript与内联服务器端一起使用`<;脚本>;`块和ASP.Net

C# 将TypeScript与内联服务器端一起使用`<;脚本>;`块和ASP.Net,c#,asp.net,server-side,typescript,C#,Asp.net,Server Side,Typescript,我希望能够在ASPX(或Razor)页面中使用内联类型脚本,在页面编译时将其转换为Javascript 因此: ... 变成 <script type="text/javascript"> ... </script> ... 它应该发生在转换@或块的同一点上 在运行时,通过某种页面后处理,这应该是可能的,但在编译时不会生成异常-我希望在脚本中查找错误的同时查找任何C#代码 理想情况下,TypeScript intellisense等应该在内联块中工作,这

我希望能够在ASPX(或Razor)页面中使用内联类型脚本,在页面编译时将其转换为Javascript

因此:


...
变成

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

...
它应该发生在转换
@
块的同一点上

在运行时,通过某种页面后处理,这应该是可能的,但在编译时不会生成异常-我希望在脚本中查找错误的同时查找任何C#代码

理想情况下,TypeScript intellisense等应该在内联
块中工作,这使我认为这应该是一个VS2012扩展


有什么办法可以做到这一点吗?

简单的回答是没有

您可以编写一个TypeScript文件并将编译好的JavaScript粘贴到其中,但这是您所能得到的最接近的结果。一个实际问题是,如果编译器将您的TypeScript转换为JavaScript,您将丢失您的TypeScript代码。这就是为什么您有一个TypeScript文件和一个JavaScript文件


将脚本内联而不是引用外部脚本的主要原因是什么?也许有另一种解决方案不需要内联脚本?

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

[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.
    }
} 
[DefaultProperty(“文本”)]
[ToolboxData(“”)
公共类TypeScript:WebControl
{  
公共字符串文本{get;set;}
受保护的覆盖无效渲染内容(HtmlTextWriter输出)
{  
AddAttribute(htmltextwriteratAttribute.Type,“text/javascript”);
如果(!string.IsNullOrEmpty(this.ID))
{
AddAttribute(HtmlTextWriterAttribute.Id,this.Id);
}
output.RenderBeginTag(“脚本”);
Write(CompileToJavaScript(Text));
output.renderndtag();
}
私有字符串编译器JavaScript(字符串类型脚本)
{
//TODO:使用代码调用tsc,并返回结果。
}
} 

如果您希望实现IO层,并消除一些JScript.NET(不是JavaScript)语法错误,那么您可能可以使用JScript.NET编译tsc.js。

虽然这不是解决问题的真正方法,但为什么不将您的TypeScript代码保留在
中,并在运行时进行编译?

  • 我要做的就是在脚本标记中声明razor所需的变量

    <script type="text/javascript">
    
    //Razor variables initialized here and declared in the TypescriptFile.ts file
    
    var url = "@Url.Action("NewRequest", "Request")";
    
    </script>
    
  • 使用它

  • 很遗憾看到VisualStudio2013仍然不提供服务器端支持


为什么?我不会丢失
@{}
块的内容。我使用内联块的原因太长,有点离题。@keith的内容在运行时保持不变。它没有改变。您没有注意到这一点。@x0n ASP.Net肯定会编译,尽管它可以根据配置编译JIT(当第一个用户访问ASPX页面时)或提前编译(导致每个ASPX页面都缩减为空占位符)。
的内容不会在浏览器中输出,但编译器也可以提取它,并在VS中发出警告。我希望TS块的行为类似于
块的特例。如果问题是“可以这样做吗?”答案是否-没有办法做到这一点。如果问题是“这可以做到吗”-这是可以做到的,尽管您需要一个在服务器上运行的编译器的实现以及一些东西来传递字符串并输出结果。您还需要扩展Visual Studio以对文本块执行静态分析,否则在设计时将无法进行任何类型检查。@Keith我不是说Visual Studio不这样做。我是说没有什么能做到这一点。不是Visual Studio,不是Web Essentials,也不是其他插件。没有什么能做到这一点。如果你写了一个插件-这将是第一个+我喜欢这个想法,但它有两个问题:TS的编译将是运行时的(就像我的后处理器想法一样),失去了TS的许多优势。同样对于VS2012,控件的内容将只是纯文本,因为这样就没有TS的编译时优势,并且为用户增加了大量的JS库/编译开销。你得到了所有的问题,却没有任何好处。干杯,但这不是我真正想问的。我想在页面服务器端内联解析TypeScript代码块,而不是在Javascript中包含代码块。谢谢Keith的评论。当然,我知道你想要什么,也需要它,但据我所知,它现在似乎没有发生,也许很快就会发生。我之所以发布这个答案,是因为人们有时会带着这样的要求阅读这个帖子,这可能会有所帮助:)
<script type="text/javascript">

//Razor variables initialized here and declared in the TypescriptFile.ts file

var url = "@Url.Action("NewRequest", "Request")";

</script>
//TypescriptFile.ts
declare var url: string;
alert(url);