我希望能够在页面编译时转换为Javascript的ASPX(或Razor)页面中使用内联TypeScript。
所以:
<script type="text/typescript" runat="server">
...
</script>
...变为
<script type="text/javascript">
...
</script>
它应该在转换@
或<% %>
块的同一点发生。
这应该可以在运行时使用某种页面后处理,但是在编译时不会产生异常 - 我想在脚本中找到与任何C#代码同时出错的错误。
理想情况下,TypeScript intellisense等应该在内联<script>
块中工作,这使我认为这应该是VS2012扩展。
有没有办法做到这一点?
答案 0 :(得分:5)
简短的回答是否定的。
您可以编写一个TypeScript文件并粘贴已编译的JavaScript,但这样就可以了。一个实际问题是,如果编译器将您的TypeScript转换为JavaScript,您将丢失TypeScript代码。这就是你有一个TypeScript文件和一个JavaScript文件的原因。
将脚本内联而不是引用外部脚本的令人信服的理由是什么?或许还有另一种不需要内联脚本的问题解决方案?
答案 1 :(得分:3)
您可以创建一个服务器控件,在运行时编译代码并缓存它:
[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)语法错误。
答案 2 :(得分:2)
有一个解决方法,我所做的是在脚本标签中声明razor所需的变量
<script type="text/javascript">
//Razor variables initialized here and declared in the TypescriptFile.ts file
var url = "@Url.Action("NewRequest", "Request")";
</script>
接下来在Typescript文件中声明url变量
//TypescriptFile.ts
declare var url: string;
alert(url);
使用它
伤心地看到的Visual Studio 2013还没有提供服务器端支持。
答案 3 :(得分:0)
虽然它不是您问题的真正解决方案,但为什么不将{4}中的TypeScript代码保留在<script type="text/typescript">
中并使用Typescript Compile在运行时编译?