在我的ASP.net代码中,有没有一个好的替代方法可以让JavaScript代码作为字符串文字?

在我的ASP.net代码中,有没有一个好的替代方法可以让JavaScript代码作为字符串文字?,javascript,asp.net,Javascript,Asp.net,在处理ASP.net web应用程序时,我一直在想,是否有一种好方法可以避免在我的ASP.net代码中使用字符串文字编写JavaScript代码。请参见此处: 在链接的示例中,我看到如下代码: Private Sub Calendar1_SelectionChanged(sender As Object, e As EventArgs) Dim strjscript as string = "<script language=""javascript"">" strjscri

在处理ASP.net web应用程序时,我一直在想,是否有一种好方法可以避免在我的ASP.net代码中使用字符串文字编写JavaScript代码。请参见此处:

在链接的示例中,我看到如下代码:

Private Sub Calendar1_SelectionChanged(sender As Object, e As EventArgs)
  Dim strjscript as string = "<script language=""javascript"">"
  strjscript &= "window.opener." & _
        Httpcontext.Current.Request.Querystring("formname") & ".value = '" & _
        Calendar1.SelectedDate & "';window.close();"
  strjscript = strjscript & "</script" & ">" 'Don't Ask, Tool Bug

  Literal1.Text = strjscript  'Set the literal control's text to the JScript code
End Sub
Private Sub Calendar1\u选择已更改(发件人作为对象,e作为事件参数)
Dim strjscript as string=“”
strjscript&=“window.opener.”_
Httpcontext.Current.Request.Querystring(“formname”)和.value=''”和_
Calendar1.SelectedDate&“;window.close();”
strjscript=strjscript&''不要问,工具错误
Literal1.Text=strjscript'将文本控件的文本设置为JScript代码
端接头
我不习惯使用很多JavaScript。我使用过的很多代码大部分都是使用T-SQL进行服务器端编码。上面的代码让我一看就头疼。它不仅丑陋,而且显示了恶意用户可以尝试注入恶意代码的模式

有没有更好的方法来避免将JavaScript代码作为字符串文本进行操作?想一想避免将T-SQL代码作为字符串文本进行操作的方法。

对于初学者来说,这比使用字符串要好得多(它更容易阅读,性能也更优化)

Dim sbuild As StringBuilder=新StringBuilder
sbuild.Append(“”)
sbuild.Append(“window.opener”)
sbuild.Append(Httpcontext.Current.Request.Querystring(“formname”))
sbuild.Append(“.value=”)
sbuild.Append(Calendar1.SelectedDate)
sbuild.Append(“;window.close();”)
sbuild.Append(“”)
Literal1.Text=sbuild.ToString

但除此之外,我建议尝试类似于课堂的东西。它说它是针对MVC的,但是我不明白为什么你也不能在Web窗体场景中使用它(你只需要导入MVC命名空间)——(虽然我在这方面可能是错的)。 有几种方法,包括Page.RegisterClientScript,通过将JavaScript代码正确地包装在适当的标记中,并将其放置在页面的适当位置(内联与开始/结束)来处理一些脏活,这些方法将处理一些格式问题

上面的代码示例是VB.Net,由于需要在每一行中添加&u,因此处理大量文本时有点粗糙。C#在这方面做得更好。好消息是随着.NET4的发布,您不再需要担心所有的行连接


如果要处理大量需要嵌入的文本,可以考虑将JavaScript保存在单独的文本文件中,并将该文件读入文字或脚本注册。如果需要一些动态数据,甚至可以进行一些简单的字符串替换。StringBuilder类也是一个帮助,它使用了Append和AppenLine方法(),但它同样取决于您处理的文本数量以及您需要处理相关代码块的频率。

一种常见的方法是使用clientscriptmanager类:

您可以调用registerstartupscript方法,该方法将脚本添加到页面末尾,在页面完成加载但引发页面的OnLoad事件之前执行

该方法将脚本添加到页面顶部。这是您可以添加常用功能的地方

  Dim script As New StringBuilder()
  script.AppendFormat("window.opener.{0}", Httpcontext.Current.Request.Querystring("formname"))
  script.AppendFormat(".value = '{0}';window.close();", Calendar1.SelectedDate)

  Dim cs As ClientScriptManager = Page.ClientScript
  cs.RegisterClientScriptBlock(Me.GetType(), "ScriptKey", script.ToString(), true)
最后一个参数告诉脚本管理器将脚本包装在
标记中,这样您就不必这样做了

此外,如果要从用户控件添加脚本,“ScriptKey”确保不会多次添加同一脚本。如果每个控件需要单独的脚本,则可以基于控件id动态生成该参数


在页面上添加脚本文件链接的另一种常用方法是动态构建javascript并将其放入文本中

通常,我在代码中嵌入javascript的唯一时间是当我制作一个自定义控件并希望它打包整齐时(不需要担心分离的js文件),即使这样,我也使用RegisterClientScriptBlock而不是像这样的hack


为什么不在页面源代码(或包含文件)中使用一个javascript函数,该函数接受两个参数(表单名称和选定日期),然后动态构建函数调用而不是整个脚本?

来自RockingTheSixstring发布的示例,如果您想“清理”代码的视觉方面,你也可以这样写:

Dim sbuild As StringBuilder = New StringBuilder
With sbuild
   .Append("<script language=""javascript"">")
   .Append("window.opener.")
   .Append(Httpcontext.Current.Request.Querystring("formname"))
   .Append(".value = ")
   .Append(Calendar1.SelectedDate)
   .Append("';window.close();")
   .Append("</script>")
End With

Literal1.Text = sbuild.ToString
或者如果您正在使用


尽可能多地移动到.js文件中


如果有的话,您应该只需要呈现简单的js函数调用。我尝试通过添加css类,然后使用jquery的类选择器来附加行为,以尽量减少对这些行为的需要。

在ASP.NET中使用JavaScript时,您应该遵循以下路径:

将其放在单独的JavaScript文件中。更容易维护

但是,如果您(出于任何原因)无法将其放入JavaScript文件中,请将其放入静态类中,该类将脚本作为常量公开,并带有用于插入值的占位符(使用@符号,这样您就不必转义字符)

像这样:

public static class JavaScriptStuff
{
    public const string SpecialScriptFormat = @"window.opener.{0}.value = '{1}';window.close();"
}
然后使用注册-这样您也不需要显式地打开/关闭脚本标记(停止人为错误)

您可以更进一步,不将脚本公开为公共属性,而是公开接受参数的“getter”方法,这增加了另一层可维护性:

public static class JavaScriptStuff
{
        private const string SpecialScriptFormat = @"window.opener.{0}.value = '{1}';window.close();"

        public string GetSpecialScript(string queryString, string selectedDate)
        {
           return string.Format(SpecialScriptFormat, queryString, selectedDate);
        }
    }
}

Page.ClientScript.RegisterStartupScript(this.GetType(), "myscript", JavaScriptStuff.GetSpecialScript(HttpContext.Current.Request.QueryString("formname"), Calendar1.SelectedDate), true);

HTH

不要写出完整的函数,而是将函数嵌入页面或外部文件中,只动态写出值。例如:

<script>
   <asp:Literal ID="ScriptValues" runat="server" />
</script>

<script>
     function foo(bar) { ... }
</script>

由于我已经切换到只使用MVC,我不能完全确定TagBuilder类是否可以在Web表单中工作。提供的代码是来自公共页面的示例。我使用VB和
public static class JavaScriptStuff
{
    public const string SpecialScriptFormat = @"window.opener.{0}.value = '{1}';window.close();"
}
string myScript = string.Format(JavaScriptStuff.SpecialScriptFormat, HttpContext.Current.Request.QueryString("formname"), Calendar1.SelectedDate);
Page.ClientScript.RegisterStartupScript(this.GetType(), "myscript", myScript, true);
public static class JavaScriptStuff
{
        private const string SpecialScriptFormat = @"window.opener.{0}.value = '{1}';window.close();"

        public string GetSpecialScript(string queryString, string selectedDate)
        {
           return string.Format(SpecialScriptFormat, queryString, selectedDate);
        }
    }
}

Page.ClientScript.RegisterStartupScript(this.GetType(), "myscript", JavaScriptStuff.GetSpecialScript(HttpContext.Current.Request.QueryString("formname"), Calendar1.SelectedDate), true);
<script>
   <asp:Literal ID="ScriptValues" runat="server" />
</script>

<script>
     function foo(bar) { ... }
</script>
var values = new StringBuilder();
values.Append("var bar = " + bar + ";");
...
ScriptValues.Text = values.ToString();