【问题标题】:How to pass Dictionary<string, string> variable from code behind to asp.net?如何将 Dictionary<string, string> 变量从后面的代码传递到 asp.net?
【发布时间】:2013-07-03 01:41:22
【问题描述】:

我正在尝试将公共字典从 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();


}

平均售价:

<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>

有什么想法吗?

【问题讨论】:

  • 究竟产生了什么错误?
  • 你能详细说明你想用 Dictionary 变量做什么吗?

标签: c# javascript asp.net web-services dictionary


【解决方案1】:

当你使用&lt;%=dict%&gt; 时,编译器会执行默认的 ToString() 方法,所以你会得到类似alert(System.Collections.Generic.Dictionary...); 的东西。请注意,这里没有引号,因此它会生成一个 javascript 错误。您可以通过将其括在引号中来“解决”此问题:alert("&lt;%=dict%&gt;");

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

下面是一些将对象输出到 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 中使用单引号。

【讨论】:

    【解决方案2】:

    我真的不知道您的代码生成的错误,但这是我所知道的。应该像这样添加或'绑定'字典:

    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();
    

    更新

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

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 2015-07-02
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2014-10-22
      • 2011-10-23
      相关资源
      最近更新 更多