代码之家  ›  专栏  ›  技术社区  ›  Vivian River

在我的ASP.net密码?

  •  1
  • Vivian River  · 技术社区  · 15 年前

    http://www.4guysfromrolla.com/articles/030202-1.aspx .

    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
    

    有没有更好的方法来避免将JavaScript代码作为字符串文字来处理?我们必须避免使用字符串来处理字符串。

    8 回复  |  直到 15 年前
        1
  •  1
  •   Paul Abbott    15 年前

    嗯,动态构建javascript并将其放入文本中?

    一般来说,我在代码中嵌入javascript的唯一一次是当我制作一个自定义控件并希望它整齐地打包时(不用担心separate js文件),即使这样,我也使用RegisterClientScriptBlock而不是像这样的黑客。

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

        2
  •  1
  •   Daniel Dyson    15 年前

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

    http://msdn.microsoft.com/en-us/library/z9h4dk8y.aspx

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

    这个 RegisterClientScriptBlock 方法将脚本添加到页面顶部。您可以在这里添加常用的fnctions。

      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)
    

    最后一个参数告诉脚本管理器包装脚本 <script>...</script> 标签,这样你就不必了。

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

    另一种向页面上的脚本文件添加链接的常用方法是 RegisterClientScriptInclude

        3
  •  1
  •   John Sheehan    15 年前

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

    <script>
       <asp:Literal ID="ScriptValues" runat="server" />
    </script>
    
    <script>
         function foo(bar) { ... }
    </script>
    

    然后在你的代码后面或任何地方(抱歉,我不做VB):

    var values = new StringBuilder();
    values.Append("var bar = " + bar + ";");
    ...
    ScriptValues.Text = values.ToString();
    
        4
  •  0
  •   Chase Florell    15 年前

    首先 StringBuilder

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

    但除此之外,我建议你试试 TagBuilder 班级。它说它是为MVC设计的,但是我不明白为什么不能在Web表单场景中使用它(您只需要导入MVC名称空间)-(尽管我在这方面可能是错的)。

        5
  •  0
  •   Dillie-O    15 年前

    在处理你的问题时有一些事情要考虑。

    有几种方法,包括第页RegisterClient脚本,来处理一些繁琐的工作,方法是将JavaScript代码正确包装在适当的标记中,并将其放置在页面中适当的位置(内联vs.开始/结束),这样可以处理一些格式问题。

    上面的代码示例是VB.Net,这对于处理大量文本来说不算粗糙,因为需要在每一行都附加&。C在这方面做得更好。好消息是,随着.NET4的发布,您不再需要担心所有的行连接。

        6
  •  0
  •   eglasius    15 年前

        7
  •  0
  •   Tim B James    15 年前

    从RockTheSixString发布的示例来看,如果您想“清理”代码的视觉方面,您还可以将其编写为:

    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
    

    不过,我会研究一下方法 Page.ClientScript

    Page.ClientScript.RegisterStartupScript  
    

    或者如果你正在使用 ScriptManager

    ScriptManager.RegisterStartupScript
    
        8
  •  0
  •   RPM1984    15 年前

    把它放在一个单独的JavaScript文件中 . 更容易维护。

    这样地:

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

    然后使用 ClientScriptManager

    http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.aspx

    string myScript = string.Format(JavaScriptStuff.SpecialScriptFormat, HttpContext.Current.Request.QueryString("formname"), Calendar1.SelectedDate);
    Page.ClientScript.RegisterStartupScript(this.GetType(), "myscript", myScript, true);
    

    您可以更进一步,而不是将脚本公开为公共属性,而是公开接受params的“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);
    

    高温

    推荐文章