0

我正在使用 asp.NET 和 c# 在搜索框上实现自动完成。这就是我划分代码的方式:我有一个类 ListSuggestions.cs、默认的 Default.aspx.cs 类和我的 jquery 自动完成代码所在的默认页面 Default.aspx。

这是我的 ListSuggestions.cs:

public class ListSuggestions
{
    public string[] loadArray(string[] companiesArray)
    {          
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand(@"SELECT [Name] FROM [Party_Company_General]", conn);
        conn.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        var companies = new List<string>();
        while (dr.Read())
        {
            companies.Add(dr["Name"].ToString());
        }
        return companiesArray = companies.ToArray();
    }
}

默认.aspx.cs:

 public partial class Default : System.Web.UI.Page
{

    private string[] companiesArray { set; get; }

    public class JavaScript
    {
        public static string Serialize(object o)
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            return js.Serialize(o);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        ListSuggestions listSuggestions = new ListSuggestions();
        String[] companiesArray = listSuggestions.loadArray(this.companiesArray);
    }

}

Default.aspx 脚本代码:

<script type="text/javascript">
      $(function () {

          var availableTags = <%=JavaScript.Serialize(this.companiesArray) %>

          $(".searchbox").autocomplete({
              source: availableTags
          });
      });
  </script>

问题是我认为companiesArrayJavaScript 代码无法访问该字符串。我的代码可能有什么问题?我该如何解决我的问题,请有人帮助我。

4

4 回答 4

2

该字段必须声明为公共/受保护的,以便从 ASPX 标记中获得适当的可见性。在任何情况下,您都可以声明一个属性:

我更喜欢受保护,其次使用该属性来存储数据。

一、改变

 private string[] companiesArray { set; get; }

至:

 public string[] companiesArray { set; get; }

改变,

String[] companiesArray = listSuggestions.loadArray(this.companiesArray);

至:

companiesArray = listSuggestions.loadArray(this.companiesArray);

改变

return companiesArray = companies.ToArray();

return companies.ToArray();
于 2013-06-20T13:00:46.763 回答
1

String[] CompaniesArray 在 Page_Load 方法的范围内是本地的。您的 Default.aspx 代码应该没问题,但实际上您并没有将任何内容加载到类级别的 CompaniesArray 中。

于 2013-06-20T12:52:20.110 回答
0

关于什么:

public String[] CompaniesArray {
    get {
        return this.companiesArray;
    }
}

然后:

<script type="text/javascript">
    $(function () {
        var availableTags = <%=JavaScript.Serialize(CompaniesArray)%>;

        $(".searchbox").autocomplete({
            source: availableTags
        });
    });
</script>

您的数组仍然可以是私有的,但提供一个公共 getter 以供所有人访问。没有任何东西会从类外部改变数组的风险。

于 2013-06-20T13:08:58.490 回答
0

我找到了解决方案。感谢所有通过给出答案帮助我的人。我将 ListSuggestions.cs 更改为:

public string[] loadArray(ref string[] companiesArray)
        {
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString);
            //Fetch the field to auto complete from the database
            SqlCommand cmd = new SqlCommand(@"SELECT [Name] FROM [Party_Company_General]", conn);
            //Open connection
            conn.Open();
            //Read data from the database
            SqlDataReader dr = cmd.ExecuteReader();
            //create a list of companies
            var companiesList = new List<string>();

            while (dr.Read())
            {
                companiesList.Add(dr["Name"].ToString());
            }
            //Convert list to an array
            companiesArray = companiesList.ToArray();

            //Return the array
            return companiesArray;
        }

另外,我将 Default.aspx.cs 代码更改为:

public partial class Default : System.Web.UI.Page
    {
        ListSuggestions listSuggestions;
        public string[] companiesArray;

        //A constructor
        public  Default()
        {
         listSuggestions= new ListSuggestions();
         companiesArray = listSuggestions.loadArray(ref companiesArray);
        }
        //Serializer
        public class JavaScript
        {
            public static string Serialize(object o)
            {
             JavaScriptSerializer js = new JavaScriptSerializer();
             return js.Serialize(o);
             }
          }
     }

我创建了一个构造函数并取消了 Page_Load 方法。

最后,我将脚本更改为:

<script type="text/javascript">
      $(document).ready(function () {

          var availableTags = <%=JavaScript.Serialize(companiesArray) %>

          $(".searchbox").autocomplete({
              source: availableTags
          });
      });
  </script>
于 2013-06-21T14:14:01.097 回答