Использование TypeScript с встроенным серверным блоком `<script>` и ASP.Net
Я хочу иметь встроенный TypeScript на странице ASPX (или Razor), которая преобразуется в Javascript при компиляции страницы.
Итак:
<script type="text/typescript" runat="server">
...
</script>
становится...
<script type="text/javascript">
...
</script>
Это должно произойти в той же точке, в которой преобразуются блоки @
или <% %>
.
Это должно быть возможно во время выполнения с какой-либо пост-обработкой страницы, но это не будет генерировать исключения во время компиляции - я хочу найти ошибки в script одновременно с любым кодом С#.
В идеале TypeScript intellisense и тому подобное должны работать в встроенном блоке <script>
, что заставляет меня думать, что это должно быть расширение VS2012.
Есть ли способ сделать это?
Ответы
Ответ 1
Короткий ответ - нет.
Вы можете написать файл TypeScript и вставить скомпилированный JavaScript, но так близко, как вы получите. Одна из практических проблем заключалась бы в том, что если компилятор преобразовал ваш TypeScript в JavaScript, вы потеряете код TypeScript. Вот почему у вас есть файл TypeScript и файл JavaScript.
Какова веская причина поместить встроенную строку script вместо ссылки на внешний script - может быть, есть другое решение вашей проблемы, которое не требует встроенных скриптов?
Ответ 2
Вы можете создать серверный элемент управления, который компилирует код во время выполнения и кэширует его:
[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.
}
}
Возможно, вы сможете скомпилировать tsc.js с JScript.NET, если вы хотите внедрить IO-слой, и отсеите некоторые синтаксические ошибки JScript.Net(а не JavaScript).
Ответ 3
-
есть для этого работа, то, что я делаю, объявляет переменные, необходимые из бритвы в теге script
<script type="text/javascript">
//Razor variables initialized here and declared in the TypescriptFile.ts file
var url = "@Url.Action("NewRequest", "Request")";
</script>
-
next объявить переменную url в файле Typescript
//TypescriptFile.ts
declare var url: string;
alert(url);
-
используйте его
-
чтобы увидеть, что Visual Studio 2013 по-прежнему не поддерживает серверную поддержку.
Ответ 4
Хотя это не реальное решение вашей проблемы, но почему бы вам не оставить свой код TypeScript как есть в <script type="text/typescript">
и использовать Typescript Компилировать, чтобы он был скомпилирован во время выполнения?