AutoCompleteExtender Returns HTML 而不是 JSON
AutoCompleteExtender Returns HTML Instead of JSON
更新 3:
GetGrowers 调用的隐藏代码:
using AjaxControlToolkit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.ServiceModel.Web;
namespace AmericanApple
{
public partial class ReceivingStation : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
bcDataTextBox.Focus();
}
[ScriptMethod]
[WebMethod]
public static string[] GetGrowers(string prefixText, int count)
{
string[] growers = { "American Apple", "Lewis", "Grice" };
return growers;
}
}
}
更新 2:
我想我已经确定了问题所在。在 Chrome 开发人员工具中查看 "Network" 选项卡时,我可以看到对 GetGrowers 的调用,并且在请求 headers 中,它要求 application/json
格式,但是在响应 header,它 returns text/html
。所以下拉列表中的所有这些字符实际上是 html.
中的整个页面
在我的工作示例中,Auto CE 调用的响应 header 是 application/json
。因此,无论出于何种原因,我的项目对此的响应格式不正确。我检查了 web.config 文件,没有发现我的工作示例和我正在处理的项目之间有任何差异。
更新:
Chrome 中发生的事情的图像:
原版:
我无法让我的 AutoCompleteExtender 工作。在 Chrome 和 FireFox 中,我的自动完成结果是一堆(随机?)字符。仅在 Internet Explorer 中,当我单击文本框时,页面冻结并且我的 Visual Studio 输出如下所示:
Exception was thrown at line 39, column 3 in eval code
0x800a1391 - JavaScript runtime error: 's' is undefined
Exception was thrown at line 37, column 3 in eval code
0x800a1391 - JavaScript runtime error: 'r' is undefined
Exception was thrown at line 31, column 3 in eval code
0x800a1391 - JavaScript runtime error: 'e' is undefined
...并无限期地继续下去。
我安装了最新的 AjaxControlToolkit:17.1.1。
我正在使用 VS Pro 2015 版本 14.0.25420.01 更新 3。
.NET 框架版本 4.7.02046
在我的 Site.Master 页面中,我声明
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
在顶部,我的脚本管理器在 body:
<asp:ScriptManager runat="server" EnablePageMethods="true" EnablePartialRendering="true">
<Scripts>
<%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>
<%--Framework Scripts--%>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="bootstrap" />
<asp:ScriptReference Name="respond" />
<asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
<asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
<asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
<asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
<asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
<asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
<asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
<asp:ScriptReference Name="WebFormsBundle" />
<%--Site Scripts--%>
</Scripts>
</asp:ScriptManager>
页面运行 AutoCompleteExtender:
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<cc1:AutoCompleteExtender ID="AutoCompleteGrower" runat="server" TargetControlID="txtGrower"
MinimumPrefixLength="0" CompletionInterval="100" EnableCaching="true" UseContextKey="false"
ServiceMethod="GetGrowers" CompletionListCssClass="autocomplete_List" CompletionListItemCssClass="autocomplete_ListItem"
CompletionListHighlightedItemCssClass="autocomplete_HighlightedListItem" FirstRowSelected="true">
</cc1:AutoCompleteExtender>
我的文本框:
<asp:TableCell><asp:TextBox ID="txtGrower" runat="server" CssClass="form-control" AutoCompleteType="None"></asp:TextBox></asp:TableCell>
我没有在 SO 上找到具有相同错误的 AutoCompleteExtender 问题。我在这里错过了什么?错误发生在我的 ServiceMethod 可以 return 之前,我知道很多。
似乎 ASP.NET 路由有问题:
不幸的是,AJAX Control Toolkit 无法检测路由是否启用。
解决此问题的最简单方法是将扩展名为 .aspx
的页面指定为 ServicePath
:
<cc1:AutoCompleteExtender
ID="AutoCompleteGrower"
runat="server"
TargetControlID="txtGrower"
MinimumPrefixLength="1"
CompletionInterval="100"
EnableCaching="true"
UseContextKey="false"
ServicePath="ReceivingStation.aspx"
ServiceMethod="GetGrowers"
FirstRowSelected="true">
有效的解决方案是将该方法添加到 Web 服务文件 (asmx.cs)。
因此 class 声明如下所示:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class AmericanAppleServices : System.Web.Services.WebService
{
以及方法声明:
[WebMethod]
public string[] GetGrowers(string prefixText, int count)
{
使用此方法,我还必须在 .aspx 页面的 AutoCompleteExtender 中声明服务路径:
ServicePath="AmericanAppleServices.asmx"
我仍然不知道为什么另一种方法行不通,但暂时可以这样做。 @MikhailTymchukDX 感谢您的帮助!
更新 3:
GetGrowers 调用的隐藏代码:
using AjaxControlToolkit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.ServiceModel.Web;
namespace AmericanApple
{
public partial class ReceivingStation : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
bcDataTextBox.Focus();
}
[ScriptMethod]
[WebMethod]
public static string[] GetGrowers(string prefixText, int count)
{
string[] growers = { "American Apple", "Lewis", "Grice" };
return growers;
}
}
}
更新 2:
我想我已经确定了问题所在。在 Chrome 开发人员工具中查看 "Network" 选项卡时,我可以看到对 GetGrowers 的调用,并且在请求 headers 中,它要求 application/json
格式,但是在响应 header,它 returns text/html
。所以下拉列表中的所有这些字符实际上是 html.
在我的工作示例中,Auto CE 调用的响应 header 是 application/json
。因此,无论出于何种原因,我的项目对此的响应格式不正确。我检查了 web.config 文件,没有发现我的工作示例和我正在处理的项目之间有任何差异。
更新:
Chrome 中发生的事情的图像:
原版:
我无法让我的 AutoCompleteExtender 工作。在 Chrome 和 FireFox 中,我的自动完成结果是一堆(随机?)字符。仅在 Internet Explorer 中,当我单击文本框时,页面冻结并且我的 Visual Studio 输出如下所示:
Exception was thrown at line 39, column 3 in eval code
0x800a1391 - JavaScript runtime error: 's' is undefined
Exception was thrown at line 37, column 3 in eval code
0x800a1391 - JavaScript runtime error: 'r' is undefined
Exception was thrown at line 31, column 3 in eval code
0x800a1391 - JavaScript runtime error: 'e' is undefined
...并无限期地继续下去。
我安装了最新的 AjaxControlToolkit:17.1.1。 我正在使用 VS Pro 2015 版本 14.0.25420.01 更新 3。 .NET 框架版本 4.7.02046
在我的 Site.Master 页面中,我声明
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
在顶部,我的脚本管理器在 body:
<asp:ScriptManager runat="server" EnablePageMethods="true" EnablePartialRendering="true">
<Scripts>
<%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>
<%--Framework Scripts--%>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="bootstrap" />
<asp:ScriptReference Name="respond" />
<asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
<asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
<asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
<asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
<asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
<asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
<asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
<asp:ScriptReference Name="WebFormsBundle" />
<%--Site Scripts--%>
</Scripts>
</asp:ScriptManager>
页面运行 AutoCompleteExtender:
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<cc1:AutoCompleteExtender ID="AutoCompleteGrower" runat="server" TargetControlID="txtGrower"
MinimumPrefixLength="0" CompletionInterval="100" EnableCaching="true" UseContextKey="false"
ServiceMethod="GetGrowers" CompletionListCssClass="autocomplete_List" CompletionListItemCssClass="autocomplete_ListItem"
CompletionListHighlightedItemCssClass="autocomplete_HighlightedListItem" FirstRowSelected="true">
</cc1:AutoCompleteExtender>
我的文本框:
<asp:TableCell><asp:TextBox ID="txtGrower" runat="server" CssClass="form-control" AutoCompleteType="None"></asp:TextBox></asp:TableCell>
我没有在 SO 上找到具有相同错误的 AutoCompleteExtender 问题。我在这里错过了什么?错误发生在我的 ServiceMethod 可以 return 之前,我知道很多。
似乎 ASP.NET 路由有问题:
不幸的是,AJAX Control Toolkit 无法检测路由是否启用。
解决此问题的最简单方法是将扩展名为 .aspx
的页面指定为 ServicePath
:
<cc1:AutoCompleteExtender
ID="AutoCompleteGrower"
runat="server"
TargetControlID="txtGrower"
MinimumPrefixLength="1"
CompletionInterval="100"
EnableCaching="true"
UseContextKey="false"
ServicePath="ReceivingStation.aspx"
ServiceMethod="GetGrowers"
FirstRowSelected="true">
有效的解决方案是将该方法添加到 Web 服务文件 (asmx.cs)。
因此 class 声明如下所示:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class AmericanAppleServices : System.Web.Services.WebService
{
以及方法声明:
[WebMethod]
public string[] GetGrowers(string prefixText, int count)
{
使用此方法,我还必须在 .aspx 页面的 AutoCompleteExtender 中声明服务路径:
ServicePath="AmericanAppleServices.asmx"
我仍然不知道为什么另一种方法行不通,但暂时可以这样做。 @MikhailTymchukDX 感谢您的帮助!