【问题标题】:passing variable values from c# to javascript将变量值从 c# 传递到 javascript
【发布时间】:2014-01-17 21:54:55
【问题描述】:

首先,很抱歉提出一个已经回答了很多次的问题,但是我已经尝试了提到的大部分程序,但仍然无法正常工作。

我有一个 ASP.NET 应用程序(服务器端),我想通过使用 WebGL(JavaScript,客户端)来可视化一些结果。我可以在 aspx 文件中创建画布并通过在 jscript 文件中编写所有必要的 JS 代码来绘制 3D 对象(立方体)(只要我知道我想提前绘制什么,并将所有内容写入脚本)。但是,我的意图是根据我的服务器端代码编写不同的对象。当我单击可视化按钮时,会触发回发。在服务器中执行一些代码,并在一个数组中返回一些坐标,在 aspx.cs 文件中全局定义。我需要将该节点坐标数组从服务器传递到 JS 文件,以便实际绘制我想要的对象。

这基本上是我尝试过的:

  • 我发现传递变量的最简单方法是在 aspx.cs(c# 代码)中声明一个公共属性,然后在 JS 中编写: var clientVariable = '<%=ServerVariable%>';

我尝试过的不是数组,而是字符串变量,如果写: alert(clientVariable); 我在窗口中看到“”,而不是实际值。我不知道我是否需要任何额外的库或什么。如果我什至无法让这个简单的示例工作,我什至不知道如何使用双数组来做到这一点。我正在使用 MCVS08、ASP.NET 3.5 和 HTML5。

  • 除此之外,我尝试不使用 JSON 转换数组,而是使用: Page.ClientScript.RegisterArrayDeclaration();

  • 我用过ClientScript.RegisterStartupScript(GetType(), "alert", "test2('" + A + "');", true);

  • 我尝试使用隐藏块来存储会话值等。

所以基本上,总结起来,我想要:

  • 服务器端:在服务器端执行了后面的代码的功能后,再次渲染页面时我会在aspx.cs中有一个全局变量,它是一个double[,]坐标,包含的坐标将定义 3D 对象的节点。

  • aspx:在 html 中(不是 asp.net)我有一个画布标签,我打算在其中进行可视化。将在客户端呈现图像的脚本存储在 JScript 文件中。在这个文件中,在一个函数中,我有一个变量 var vertices = [];我需要在坐标数组中输入从服务器获得的值。我不知道如何以最好的方式实现这一目标。你会推荐使用 AJAX 吗?

任何建议/评论将不胜感激。由于带有简单字符串的虚拟示例不起作用(忘记画布、webGL 和所有这些东西),我可能需要其他任何东西,还是我误解了如何正确地做到这一点?

【问题讨论】:

    标签: javascript asp.net arrays parameter-passing


    【解决方案1】:

    你能像这样序列化数据吗:

    <% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %>
    var doublearr = <%= serializer.Serialize(ServerVariable) %>;
    

    【讨论】:

    • 那么变量序列化器是定义在Jscript中还是在aspx.cs中呢?我猜它在后面的代码中,但只是为了弄清楚每个应该放在哪里
    【解决方案2】:

    当我需要将变量传递给 JavaScript 时,我通常更喜欢 var clientVariable = '&lt;%=ServerVariable%&gt;'; 解决方案。这种方法对于少量的标量变量就足够了。如果需要传递复杂对象或数组,请考虑使用JavaScriptSerizlizer

    由于多种原因,您的行为可能会发生。如果您已将 scriptlet 包含在 .js 文件中而不是 .aspx 文件中,则可能会发生其中一种情况。

    我会这样做:

    webgl-draw-file.js:

    window.WebGlDraw = function(points /* point array */)
    {
      // Draw points here
    }
    

    Page1.aspx.cs:

    public string GetSerializedServerVariable()
    {
        new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ServerVariable);    
    }
    

    Page1.aspx:

    <html>
    <header>
        <script src="webgl-draw-file.js"/>
        <script type=text/javascript>
            window.WebGlDraw(<%=this.GetSerializedServerVariable()%>);
        </script>
    </header>
    <body>
    ...
    </body>
    </html>
    

    要更好地了解传递给 JS 函数的值,请使用浏览器查看页面源代码。您应该会看到数组的 JSON 表示,而不是 &lt;%=Page.GetSerializedServerVariable()%&gt; scriptlet。

    它应该看起来像这样:

    <html>
    <header>
        <script src="webgl-draw-file.js"/>
        <script type=text/javascript>
            window.WebGlDraw([{x:1, y:2}, {x:1, y:2}, {x:1, y:2}, {x:1, y:2}]);
        </script>
    </header>
    <body>
    ...
    </body>
    </html>
    

    【讨论】:

    • 感谢您的回复。首先,我仍然不明白为什么如果使用var clientVariable = '&lt;%=ServerVariable%&gt;'; 我没有得到值,但我得到了我所说的打印的字符串。我将脚本 src="JSfile" 包含到了 aspx 文件中,是否只是因为我将它放在与 aspx 页面分离的 JS 文件中?此外,我会尝试你的解决方案,但在我看来,它没有正确序列化数据(我的应用程序,不知道我是否仍然缺少 smthg。Nm 我会在尝试你的代码后告诉你,thnx ;)
    • 你的代码给了我这个错误:“System.Web.UI.Page”不包含“GetSerializedServerVariable”的定义。这是缺少库或某些 #include 时的典型错误,您认为我们缺少 smthg 吗?
    • 糟糕,修复了编译错误。 Page.GetSerializedServerVariable() => this.GetSerializedServerVariable()
    • 是的,你没有得到序列化的值,因为它在单独的 JS 文件中。这些脚本仅在 .aspx/ascx 文件中有效。
    • 谢谢,我可以看到所有的问题都是试图在单独的 JS 文件中使用这些小脚本,以便 aspx 文件“更干净”。我还没有尝试过这个数组,但现在我实际上得到了一个字符串变量的值,而之前我没有。再次,非常感谢你!
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2019-01-23
    • 1970-01-01
    • 2019-11-24
    • 2015-09-19
    • 2011-11-14
    • 2017-06-03
    • 2013-07-17
    相关资源
    最近更新 更多