Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ASP.Net自动完成,Javascript/Json post不起作用_Javascript_C#_Jquery_Asp.net_Json - Fatal编程技术网

C ASP.Net自动完成,Javascript/Json post不起作用

C ASP.Net自动完成,Javascript/Json post不起作用,javascript,c#,jquery,asp.net,json,Javascript,C#,Jquery,Asp.net,Json,我目前正在使用一个c asp.net用户控件,其中需要一个功能自动完成 正如您所看到的,脚本看起来好像要运行;进度条旋转,但总是返回“错误”。我不知道接下来该怎么办。我遵循了至少5个不同的教程来实现这一点;代码模仿找到的代码;但当一切都说了又做了的时候,它似乎不起作用。我错过了什么?如果有任何建议能让我达到我需要的地方,我将不胜感激 如果需要更多的信息,请告诉我,但完整的代码可以在下面找到 HTML/Javascript C代码隐藏 变量searchText不存在,因为: 您的功能从以下内容开始

我目前正在使用一个c asp.net用户控件,其中需要一个功能自动完成

正如您所看到的,脚本看起来好像要运行;进度条旋转,但总是返回“错误”。我不知道接下来该怎么办。我遵循了至少5个不同的教程来实现这一点;代码模仿找到的代码;但当一切都说了又做了的时候,它似乎不起作用。我错过了什么?如果有任何建议能让我达到我需要的地方,我将不胜感激

如果需要更多的信息,请告诉我,但完整的代码可以在下面找到

HTML/Javascript C代码隐藏 变量searchText不存在,因为:

您的功能从以下内容开始:

public static List<string> GetAutoCompleteData(string username)
应该是:

public static List<string> GetAutoCompleteData(string searchText)

您忘记将用户名更新为searchText。

因为您希望返回JSON,您可能需要尝试以下操作:

添加以下声明:

using System.Web.Script.Serialization;
然后对列表结果变量执行以下操作:

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue; // optional
return serializer.Serialize(result);
更新-这里有一个更完整的将数据输出到JSON的解决方案:

public static string GetDataTableToJSONString(DataTable table) {
    List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
    foreach (DataRow row in table.Rows) {
        Dictionary<string, object> dict = new Dictionary<string, object>();
        foreach (DataColumn col in table.Columns) {
            dict[col.ColumnName] = row[col];
        }
        list.Add(dict);
    }
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    serializer.MaxJsonLength = Int32.MaxValue;
    return serializer.Serialize(list);
}

public static List<string> GetAutoCompleteData(string searchText) {
    string sql = "SELECT TOP 1000 [SearchTerm] FROM [Search].[dbo].[Cache] " +
        "where AutoCompleteTerm = 0 and SearchTerm LIKE @SearchText + '%';";
    using (SqlConnection con = new SqlConnection(dbSearch)) {
        con.Open();
        using (SqlCommand cmd = new SqlCommand(sql, con)) {
            cmd.Parameters.AddWithValue("@SearchText", searchText);
            using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
                using (DataSet ds = new DataSet()) {
                    da.Fill(ds);
                    return GetDataTableToJSONString(ds.Tables[0]);
                }
            }
        }
    }
}

在aspx页面中,您需要声明一个WebMethod,它将调用用户控件中的代码。我在我们的一个网站上就是这样做的:

[WebMethod]
public static WebMethodReturn<IEnumerable> GetWatchboxes()
{
    return AddOns_WatchboxAdmin.GetWatchboxes();
}
…确保在jQuery中调用aspx页面的页面方法url而不是控件

我的回答可能也有一点帮助,特别是关于调试web流量的建议

需要注意的是,错误字符串位于jQuery错误块中。这意味着可能是传输错误或jQuery中的某种错误。我的猜测是因为在aspx页面中没有page方法,只有在用户控件中。此错误块不会捕获服务器端异常。我返回一个带有数据属性和错误属性的小包装器类;我将任何异常字符串放入Error属性中,否则将其保留为null。我在客户端检查这个字符串。这是可选的,只是jQuery对.NET异常一无所知的一点提示——我并不认为异常是这里的问题所在

ASMXWeb服务中需要该属性才能返回JSON,但由于我不知道的原因,您在页面方法中不需要该属性

您当然不需要按照另一个答案中的说明手动序列化JSON。如果jQuery正确调用,我给出的示例将返回JSON,无需进一步的工作

因此,总结一下,将其放入您的aspx.cs中:

[WebMethod]
public static List<string> GetAutoCompleteData(string searchText)
{

并在aspx页面上的用户控件实例中调用并返回相同函数的结果,或在用户控件中使函数公开为静态函数。如果出现任何问题,请检查Fiddler中的客户端调用和服务器响应。

这不会改变任何事情。“错误”警报仍然存在。它肯定需要修复。您是否尝试过删除ScriptMethod?我不太喜欢AJAX,但我相信这是为了GET,你正在写一篇文章。尝试删除它,但没有效果。仍然失败。文件的内容是什么:Search_Textbox.aspx您得到的实际错误是什么?@entropic这是问题的一部分。我不是javascripter,也不太确定如何获得与c的ex.ToString等效的函数来输出错误消息。如果将错误函数更改为:error:function xhr,msg,e{alertJSON.parsexhr.responseText.message;}。。你看到了什么?@entropic在代码中什么都没有发生。你的dbSearch在代码中等于连接字符串而不是db字符串吗?好的,我得到了不能隐式转换类型'string'o'System.Collections.Generic.list没关系,我明白为什么;正在进行更新以修复它。
public static string GetDataTableToJSONString(DataTable table) {
    List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
    foreach (DataRow row in table.Rows) {
        Dictionary<string, object> dict = new Dictionary<string, object>();
        foreach (DataColumn col in table.Columns) {
            dict[col.ColumnName] = row[col];
        }
        list.Add(dict);
    }
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    serializer.MaxJsonLength = Int32.MaxValue;
    return serializer.Serialize(list);
}

public static List<string> GetAutoCompleteData(string searchText) {
    string sql = "SELECT TOP 1000 [SearchTerm] FROM [Search].[dbo].[Cache] " +
        "where AutoCompleteTerm = 0 and SearchTerm LIKE @SearchText + '%';";
    using (SqlConnection con = new SqlConnection(dbSearch)) {
        con.Open();
        using (SqlCommand cmd = new SqlCommand(sql, con)) {
            cmd.Parameters.AddWithValue("@SearchText", searchText);
            using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
                using (DataSet ds = new DataSet()) {
                    da.Fill(ds);
                    return GetDataTableToJSONString(ds.Tables[0]);
                }
            }
        }
    }
}
[WebMethod]
public static WebMethodReturn<IEnumerable> GetWatchboxes()
{
    return AddOns_WatchboxAdmin.GetWatchboxes();
}
[WebMethod]
public static List<string> GetAutoCompleteData(string searchText)
{