如何传递Dictionary<字符串,字符串>从代码隐藏到asp.net的变量

How to pass Dictionary<string, string> variable from code behind to asp.net?

本文关键字:字符串 asp 隐藏 net 变量 代码 gt Dictionary 何传递 lt      更新时间:2023-09-26

我正试图将公共字典从c#传递到asp.net。

这是我的代码:

代码背后:

public Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
          RetrieveDataField();
        }
    }
 void RetrieveDataField()
{
    DataDefinitionResponse[] _dr = _service.DataDefinitionList(_companyID);
    DataTable dt = new DataTable();
    dt.Columns.Add("Name");
    dt.Columns.Add("Type");
    foreach (DataDefinitionResponse dr in _dr)
    {
        if (dr.Type != "Group" && dr.Type != "File")
        {
            DataRow row = dt.NewRow();
            row["Name"] = dr.Name;
            row["Type"] = dr.Type;
            dt.Rows.Add(row);
            if (dr.Type == "Dropdown")
            {
                string[] strSplit = dr.ListValue.Split('|');
                List<string> lst = new List<string>();
                foreach (string word in strSplit)
                {
                    lst.Add(word);
                }
                dict.Add(dr.Name, lst);
            }
        }
    }
    ddlFieldName.DataSource = dt;
    ddlFieldName.DataTextField = "Name";
    ddlFieldName.DataValueField = "Type";
    ddlFieldName.DataBind();

}

ASP:

<script  type="text/javascript">
    $(document).ready(function () {
        alert(<%=dict%>); //Error here
        $("#MainContent_ddlFieldName").live("change", function () {
            $.ajax({
                type: "POST",
                url: "WebService/WebFunction.asmx/PopulateDropdown",
                data: "{'dict': '" + 'a' + "'}",
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                success: function (data) {
                   // data.d;
                    // $("#txtBLShipperContactNo").val(data.d);
                    alert(data.d);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert("Error Shipper: " + errorThrown);
                }
            });
        });
    });
</script>

有什么想法吗?

当您使用<%=dict%>时,编译器正在对其执行默认的ToString()方法,因此您会得到类似alert(System.Collections.Generic.Dictionary...);的东西。请注意,这里没有引号,因此它会生成一个javascript错误。你可以用引号把它括起来"修复"这个问题:alert("<%=dict%>");

然而,这可能不是你想要做的。你很可能试图将实际的字典放入Javascript对象中。为此,可以使用javascript的JSON.parseSystem.Web.Script.Serialization.JavaScriptSerializer将数据输出为JSON对象。如果你使用的是jQuery,那么你可以使用parseJSON,否则你可以在大多数浏览器上使用JSON.parse,我想(我总是使用jQuery,所以我比浏览器提供的JSON.parce更熟悉它)

以下是一些将对象输出到JSON:的代码

public string DictJSON
{
    get { 
        JavaScriptSerializer jSer = new JavaScriptSerializer();
        return jSer.Serialize(dict);
    }
}

以下是使用jQuery:的消费方式

$.parseJSON('<%=DictJSON %>');

请注意,JavaScriptSerializer是System.Web.Extensions.dll的一部分,因此您需要添加对它的引用。它不能处理所有对象类型,但Dictionary应该可以,List也应该可以。此外,由于它以双引号输出JSON对象字符串,请确保在parseJSON中使用单引号。

我真的不知道你的代码产生的错误,但我知道的是。字典应该添加或"隐藏",如下所示:

DataTable dt = new DataTable();
Dictionary<string,string> dict = new Dictionary<string,string>();
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Type", typeof(string)));
foreach (DataDefinitionResponse dr in _dr)
{
    if (dr.Type != "Group" && dr.Type != "File")
    {
        DataRow row = dt.NewRow();
        row["Name"] = dr["Name"].toString();
        row["Type"] = dr["Key"].toString;
        dt.Rows.Add(row);
    }
}
foreach(DataRow dr in dt.Rows)
{
    dict.Add(dr.ItemArray[0].ToString(), dr.ItemArray[1].ToString());
}
ddlFieldName.DataSource = dict; // the dictionary should be here
ddlFieldName.DataTextField = "Key";
ddlFieldName.DataValueField = "Value";
ddlFieldName.DataBind();

或者在第一个foreach循环中添加Dictionary元素,如下所示:

foreach (DataDefinitionResponse dr in _dr)
    {
        if (dr.Type != "Group" && dr.Type != "File")
        {
            DataRow row = dt.NewRow();
            row["Name"] = dr["Name"].toString();
            row["Type"] = dr["Key"].toString();
            dt.Rows.Add(row);
            dict.Add(dr["Key"].ToString(), dr["Name"].ToString());
    }
}
ddlFieldName.DataSource = dict; // the dictionary should be here
ddlFieldName.DataTextField = "Key";
ddlFieldName.DataValueField = "Value";
ddlFieldName.DataBind();

更新

您以错误的方式声明或初始化列。你可以试试我的更新。