将数据集从c#传递到客户端javascript

时间:2017-09-30 07:02:57

标签: javascript c# asp.net

我想要实现的是我想从asp.net将数据集传递给客户端javascript。 请参阅下面的c#代码:

DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Sql CONN"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("spuGetDetailsById", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@BPId", SqlDbType.Int).Value = column2;

        con.Open();
        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(ds);                
        }
    }
}

var serializedDS = JsonConvert.SerializeObject(ds, Formatting.None, new JsonSerializerSettings()
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), serializedDS, "Func()", true);

数据集有2个表,我正确地接收数据。但是当我试图将它传递给javascript时,它显示未定义。 我的js代码:

function Func(serializedDS) {
    if (serializedDS != null)
    {
        var a = serializedDS[0]; // The table1
        var b = serializedDS[1]; // The table2
    }
}

请帮忙。

编辑:

我也尝试过这种方法。它还将serializedDS定义为undefined。 Json序列化数据虽然在代码中显示数据集。

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", string.Format("Func('{0}');", serializedDS), true);

1 个答案:

答案 0 :(得分:0)

您需要在javascript方法中返回serializedDS

ScriptManager.RegisterStartupScript(Page, Page.GetType(), 
    "getSerializedDS", 
    $"return {serializedDS};", 
    true
);

稍后,您需要调用动态注册的函数来访问javascript中的数据集:

function Func() {
    var serializedDS = getSerializedDS();

    if (serializedDS != null)
    {
        var a = serializedDS[0]; // The table1
        var b = serializedDS[1]; // The table2
    }
}

但是,不需要注册函数来检索变量。为此目的使用RegisterClientScriptBlock

ScriptManager.RegisterClientScriptBlock(
    Page, 
    Page.GetType(), 
    "initMyDs", 
    $"var myDs = {serializedDS}", 
    true
);

然后像往常一样访问javascript中的myDs变量。

function Func() {
    if (myDs != null)
    {
        var a = serializedDS[0]; // The table1
        var b = serializedDS[1]; // The table2
    }
}

此外,the ScriptManager仅用于部分页面回发中使用的脚本 - 即当注册控件位于UpdatePanel时。如果您不使用UpdatePanel,请执行Page.ClientScript

Page.ClientScript.RegisterClientScriptBlock(
    Page.GetType(), 
    "initMyDs", 
    $"var myDs = {serializedDS}", 
    true
);