【问题标题】:Pass an asp.net variable to javascript failed将 asp.net 变量传递给 javascript 失败
【发布时间】:2012-04-05 00:29:46
【问题描述】:

我打算将一个变量从 asp.net 服务器传递到 javascript,但出现异常。

当前上下文中不存在名称“序列化程序” 在我的 Admin.aspx.cs

 protected static string urlEdit;
    protected void Page_Load(object sender, EventArgs e)
    {
        // blah blah...
        var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    }

然后在标记代码中:

<script type="text/javascript">
            function Edit_Click() {
                var options = SP.UI.$create_DialogOptions();


                options.url = <%= serializer.Serialize(urlEdit) %>;

                              };

【问题讨论】:

  • 您的变量必须能够被生成的页面标记访问,因此请在 Page_Load 之外声明它。我提出了一个解决方案,它可以被认为是隐藏字段的更好实践。
  • @ericosg 隐藏字段不是好习惯...
  • @user1090190 为什么隐藏字段不是很好的做法?
  • @jrummell 为什么要在不需要时发送额外数据?
  • 这取决于问题的上下文。如果您需要额外的数据,那么它不会是额外的。

标签: javascript asp.net


【解决方案1】:

serializer 只存在于Page_Load 中。为什么不创建返回序列化值的公共方法或属性,而不是从您的标记中访问序列化程序?

protected static string urlEdit;
protected void Page_Load(object sender, EventArgs e)
{
    // blah blah...
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
}

public string GetSerializedUrl()
{
    return serializer.Serialize(urlEdit);
}

然后在你的标记中调用这个方法:

options.url = "<%= GetSerializedUrl() %>";

更新

其实......你不需要序列化一个字符串来使用它的javascript。因此您的代码可以简化为以下内容:

protected static string urlEdit = "www.example.com";

还有简化的标记:

options.url = "<%= urlEdit  %>";

【讨论】:

    【解决方案2】:

    尝试将其用引号括起来,以便 javascript 将其视为字符串...

    options.url = '<%= serializer.Serialize(urlEdit) %>';
    

    您的代码将呈现...

    options.url = site.com/url;//invalid javascript
    

    我会在哪里渲染...

    options.url = 'site.com/url';//valid javascript
    

    【讨论】:

    • 这是朝着正确方向迈出的一步。也许您的字符串中有转义字符?比如 `\` (反斜杠)?另外,您有任何 javascript 错误吗?
    【解决方案3】:

    serializer 仅存在于 Page_Load 函数中。为了让您的内联代码能够识别它,需要在类命名空间中声明它。

    protected static string urlEdit;
    protected var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    

    musefan 也是对的,options.url 需要用引号括起来。

    【讨论】:

    • 这不是全局的,它是一个类的公共字段。
    【解决方案4】:

    通常不是序列化变量,而是使用这个值将值注入到 javaScript 中

    ClientScript.RegisterClientScriptBlock(this.GetType(), "variable", "<script language=javascript> var variableUrl='" + urlEdit+"' </script>");
    

    注意这段代码应该在你页面的加载方法中

    然后在你的脚本中,你可以像这样使用变量

        <script type="text/javascript">
            function Edit_Click() {
                var options = SP.UI.$create_DialogOptions();
    
    
                options.url = variableUrl;
    
                              };
    

    【讨论】:

      【解决方案5】:

      就我个人而言,我发现利用隐藏字段来完成这项工作很容易。

      标记 (.aspx)

      <asp:HiddenField ID="hiddenRequest" runat="server" ClientIDMode="Static" />
      

      背后的代码 (.aspx.cs)

      hiddenRequest.value = "Test!";
      string test = (string)hiddenRequest.value;
      

      带有 jQ​​uery 的 Javascript(便于选择)(.js)

      $('#hiddenRequest').val('Test!');
      var test = $('#hiddenRequest').val();
      

      【讨论】:

      • 也许我应该在陈述我个人的选择之前详细说明为什么我认为这是一种更好的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2018-09-23
      • 2012-01-28
      • 2012-10-24
      • 2021-04-21
      • 2019-03-24
      • 2021-04-16
      相关资源
      最近更新 更多