如何从后面的 C# 代码传输序列化的 JSON 字符串以在 Javascript 中使用

How to transfer a serialized JSON string from C# code behind to use in Javascript

这里的最终目标是从背后的 C# 代码中的对象填充 Bootstrap 模态的字段,该对象具有我需要的所有数据。我从后面的代码中序列化了对象,像这样:

JavaScriptSerializer serializer = new JavaScriptSerializer();
sJSON = serializer.Serialize(aerationsystem.AerationSystem);

现在我想在我的 Javascript 函数中引用 JSON,如下所示:

</form>
    <script type="text/javascript">
        function fillModal() {
            var diameterValue = document.getElementById('diameter');            
            var aeration = <%# sJSON %>;
            diameterValue.innerText = aeration.dBinDiameter;
        }
    </script>
</asp:Content>

(我包含了关闭表单标签和关闭 asp:Content 标签,所以你们都可以看到我把这个 Javascript: 放在文件末尾的位置。)

但是,当我调用那个 Javascript 函数时,这是我在浏览器的调试器中看到的:

    <script type="text/javascript">
        function fillModal() {
            var diameterValue = document.getElementById('diameter');            
            var aeration = ;
            diameterValue.innerText = aeration.dBinDiameter;
        }
    </script>

我从这里得到了灵感:Any way to pass an object from c# code behind to javascript? 但是,访问 JSON 变量的方法对我不起作用。我试过移动我的脚本,但是当我这样做时,我收到一条错误消息 "The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)."。我尝试过其他分隔符,例如 <%= %>,但根据脚本放置,我会遇到相同的错误。我究竟做错了什么?如何让 JSON 字符串显示在我的 Javascript 函数中?

<%# %> 是一个绑定块,因此您需要调用 Page.DataBind() 方法,无论是在 Page_Load 还是 Page_PreRender 事件中。

您还需要整理字符串,以便 JSON 文本不会破坏您的 javascript:

var aeration = '<%# sJSON.Replace("'", "\'").Replace("\n", " ") %>';

<%# %> 语法用于从数据源绑定数据。

最简单的方法是使用文字服务器控件。在 script 标签中看起来有点奇怪,但它完成了工作。

<script type="text/javascript">
    function fillModal() {
        var diameterValue = document.getElementById('diameter');
        var aeration = <asp:Literal id="JsonLiteral" runat="server"/>;
        diameterValue.innerText = aeration.dBinDiameter;
    }
</script>

代码隐藏

JavaScriptSerializer serializer = new JavaScriptSerializer();
JsonLiteral.Text = serializer.Serialize(aerationsystem.AerationSystem);

非常感谢您抽出时间回答我的问题!在你们所有人的启发下,我最终解决了这个问题。我没有使用 Literal 控件,而是在页面上使用 <asp:HiddenField> 控件来存储值。然后,我将其值提取到 Javascript 变量中。

隐藏字段:<asp:HiddenField ID="JsonLiteral" runat="server" />

事件中赋值的代码:

JavaScriptSerializer serializer = new JavaScriptSerializer();
JsonLiteral.Value = serializer.Serialize(aerationsystem.AerationSystem);

以及完成作业的JavaScript:

function fillModal() 
    {
        $(document).ready(function () {
            var diameter = document.getElementById('diameter');
            var control = document.getElementById('<%= JsonLiteral.ClientID%>');
            var aeration = JSON.parse(control.value);

            diameter.innerText = aeration.dBinDiameter;
        });
    }

(当然,除了那个 属性,还有更多内容。)

再次感谢大家的帮助,没有你们我做不到!