【问题标题】:Parse 2D array from ASP.NET C# code behind to Javascript将 2D 数组从 ASP.NET C# 代码解析为 Javascript
【发布时间】:2016-03-10 15:56:34
【问题描述】:

我编写了一个函数(addCalendarEvents),它接收一个数组(事件)并解析成一个自定义日历。当它通过 document.ready 函数触发时,一切工作正常,事件正在注册等等。

Javascript

$(document).ready(function () {
    loadCalendar(null);
    addCalendarEvents([{ title: 'All Day Event', start: '2016-01-01' }, { title: 'Long Events', start: '2016-01-07', end: '2016-01-10' }]);     
});

function addCalendarEvents(events) {
    $('#calendar').fullCalendar('addEventSource', events)
}

但是,我还需要通过 背后的代码 触发它们以动态添加事件。我尝试过使用 ScriptManager 的 RegisterStartupScript,但它不起作用。我有合适的方法吗?

背后的 C# 代码

protected void Page_Load(object sender, EventArgs e) 
{
    ScriptManager.RegisterStartupScript(this, this.GetType(), "addEvents", "addCalendarEvents([{ title: 'Other Event', start: '2016-01-01' }, { title: 'Other Long Events', start: '2016-01-07', end: '2016-01-10' }]);", true);
}

【问题讨论】:

    标签: javascript c# jquery asp.net webforms


    【解决方案1】:

    使用包含$(document).ready() 函数的<asp:Literal id="StartupScript" runat=server /> 控件来注入页面加载标注可能更简单。

    您可以将语句写入 Page_Load 事件中的文字控件,并且它们应该在页面准备好时由客户端执行。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication4.WebForm1" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
        <asp:Literal ID="CodeInject" runat="server"/>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
        </div>
        </form>
    </body>
    </html>

    而后面的代码是:

     protected void Page_Load(object sender, EventArgs e)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("<script>");
            SB.Append("$(document).ready(function () {");
    
            // statements here
            SB.Append("alert('test');");
    
    
            SB.Append("});</script>");
            CodeInject.Text = SB.ToString();
        }
    

    【讨论】:

    • 您不能只在 document.ready() 函数中放置一个 aspx 控件。您如何建议他们这样做?
    • 无可否认,自从我使用 asp.net 控件以来已经有一段时间了,但我确实记得将包括&lt;script&gt; 和 document.ready 函数在内的整个标签都写入了一个 asp 文字。您可能需要做一些奇怪的事情,例如拆分“
    • 我用一个简单的例子修改了我的答案。我在本地对其进行了测试,它确实在页面加载时执行了语句。希望有帮助!
    • @NickT 谢谢,你的方法奏效了。我尝试在 Literal 控件上方初始化日历,然后在 Literal 控件中添加事件,但它不起作用。我又试了一次,这次在 Literal 控件中初始化和添加事件,它可以工作,很奇怪呃.. 我认为日历插件只允许在初始化日历时在页面加载功能上解析事件。跨度>
    • @WaftureRobin 很高兴你能成功!我打算建议您仍然需要 SB.Append("$(document).ready(function () {"); 和 `SB.Append("});");` 部分示例。
    【解决方案2】:

    在添加脚本时尝试将数据转换为 json。添加你的程序集

    using this Assembly
    using System.Web.Script.Serialization;
    

    然后反序列化你的对象

    var json = new JavaScriptSerializer().Serialize(obj);
    

    然后调用 registerStartupScript

    ScriptManager.RegisterStartupScript(this, this.GetType(), "addEvents", json, true);
    

    并在客户端执行此操作以将其转换为 json

    var obj = JSON.parse(string);
    

    【讨论】:

    • 那么'obj'应该是什么,一个字符串?假设我想解析 '[{ title: 'All Day Event', start: '2016-01-01' }, { title: 'Long Events', start: '2016-01-07', end: '2016-01-10' }]' 我该怎么做?我是否必须创建一个包含属性“标题”、“开始”和“结束”的类?
    • obj 将是您想要转换为 json 字符串或创建您自己的类而不是将其转换为 json 的任何类的 c# 对象,这取决于您希望如何查看您的 json 是的,您是对的,您有使用您的数据创建类,而不是将其转换为 json 以在前端使用
    • 查看我发布的答案。我用你的方法试过了,还是不行。
    • 没关系,你唯一要做的就是 var obj = JSON.parse(string);在客户端
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多