将asp.net值传递给javascript块

时间:2011-11-15 16:14:30

标签: asp.net

我需要将我的asp.net代码中的值传递给页面中的javascript代码块。

我至少知道两种方法:

<script runat=server>
int a = 42;
protected override void OnInit(EventArgs e)
{
   lbl.Text = "42";
}
</script>

<script>
   var a = <%= a %>;
   var b = <asp:Literal runat=server id=lbl>/>;
   alert("the meaning of life=" + a + " or " + b);
</script>

但是在asp.net WebForms中有更好的方法将asp.net代码中的变量值绑定到javascript块吗?这两个看起来都很混乱,因为它们不支持intellisense。

5 个答案:

答案 0 :(得分:2)

我最终做了一些我认为更强大的事情。在母版页中我添加了这个:

public Dictionary<string, object> JavaScriptVars { get; set; }

然后我将此函数的结果附加到页面:

public string GetJavaScriptVars()
{
    if (JavaScriptVars.Count == 0) return null;
    StringBuilder sb = new StringBuilder();
    sb.Append("<script>");
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    int i = 0;
    foreach (string s in JavaScriptVars.Keys)
    {
        if (i == 0)
            sb.Append("var ");
        sb.Append(s + "=");

        object o = JavaScriptVars[s];
        if (o is System.Collections.Specialized.NameValueCollection)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>();
            foreach (string key in ((System.Collections.Specialized.NameValueCollection)o).Keys)
                dict[key] = ((System.Collections.Specialized.NameValueCollection)o)[key];
            o = dict;
        }
        sb.Append(serializer.Serialize(o));
        sb.Append(i == JavaScriptVars.Count - 1 ? ";" : ",");
        i++;
    }
    sb.Append("</script>");
    return sb.ToString();
}

所以现在我可以这样做:

JavaScriptVars["Name"] = "John"; //string
JavaScriptVars["Age"] = 32; //int
JavaScriptVars["Hobbies"] = new string[]  { "Sewing", "Hiking" }; //array

在我的最后一页中,我得到了:

<script>
    var Name='John',Age=32,Hobbies=["Sewing", "Hiking"];
</script>

所以现在我有一种强大的方法可以将没有脚本块或标签的正确管理类型的值传递给页面。

答案 1 :(得分:1)

通常,最佳解决方案是将值存储在页面上的隐藏字段中:

var el = document.getElementById("<%=HiddenField1.ClientID%>");
if (el){
    var value = el.value;
}

你也可以考虑使用PageMethods
http://geekswithblogs.net/WillSmith/archive/2008/12/09/asp.net-pagemethods-to-the-rescue.aspx

答案 2 :(得分:0)

向您的代码隐藏添加受保护的属性,并从javascript访问它:

服务器:

Protected ReadOnly Property MeaningOfLife() As Int32

    Get

        Return 42

    End Get

End Property

客户端:

<script>     

    var a = <%= Me.MeaningOfLife %>;     
    var b = <asp:Literal runat=server id=lbl>/>;     
    alert("the meaning of life=" + a + " or " + b);  

</script>

答案 3 :(得分:0)

在你的例子中,我坚持使用var a = <%= a %>;

如果a的值(.NET值)与页面上的元素有某种连接,则可以将该值放在元素本身中。例如,如果页面上有一个表行,其中包含javascript将使用的额外数据,但该行的上下文中包含数据。

<tr data-myvalue='<%=a%>'></tr>

然后你可以使用javascript(也许是jQuery)来增加那个数据值,而不是在<script>块中放入一堆断开连接的变量和值

答案 4 :(得分:0)

在代码后面的文件中声明一个变量,例如:

string s;

您可以以任何方式填充此变量。现在我可以在javascript中访问此变量,如下所示。 (如果你需要传递一个字符串,你必须指定分隔符“或”):

var a = '<%= a %>';