C# 不支持Telerik.Web.UI.RadComboxContext,因为它实现IDictionary
这是我的web服务代码C# 不支持Telerik.Web.UI.RadComboxContext,因为它实现IDictionary,c#,asp.net,visual-studio,telerik,C#,Asp.net,Visual Studio,Telerik,这是我的web服务代码 private const int ItemsPerRequest = 10; [WebMethod] public RadComboBoxItemData[] GetAccount(object context) { RadComboBoxContext obj = (RadComboBoxContext)context; DataTable data = GetDataAccount(obj.Text); RadComboBoxData co
private const int ItemsPerRequest = 10;
[WebMethod]
public RadComboBoxItemData[] GetAccount(object context)
{
RadComboBoxContext obj = (RadComboBoxContext)context;
DataTable data = GetDataAccount(obj.Text);
RadComboBoxData comboData = new RadComboBoxData();
int itemOffset = obj.NumberOfItems;
int endOffset = Math.Min(itemOffset + ItemsPerRequest, data.Rows.Count);
comboData.EndOfItems = endOffset == data.Rows.Count;
List result = new List(endOffset - itemOffset);
for (int i = itemOffset; i < endOffset; i++)
{
RadComboBoxItemData itemData = new RadComboBoxItemData();
itemData.Value = data.Rows[i]["AccountLevelNo"].ToString();
itemData.Text = data.Rows[i]["AccountDesc3"].ToString();
itemData.Attributes.Add("Level6", data.Rows[i]["AccountDesc2"].ToString());
itemData.Attributes.Add("Level1", data.Rows[i]["AccountDesc1"].ToString());
result.Add(itemData);
}
comboData.Items = result.ToArray();
// comboData.Message = GetStatusMessage(endOffset, data.Rows.Count);
return comboData.Items.ToArray();
}
private static DataTable GetDataAccount(string text)
{
int accCode = 0;
string query = "select COA.LevelAccountNo,COA.AccountDesc as AccountDesc3,Level1.AccountDesc as AccountDesc1, Level2.AccountDesc as AccountDesc2 from COA COA,(select LevelAccountNo,AccountDesc " +
"from COA where len(LevelAccountNo)=2)as Level1,(select LevelAccountNo,AccountDesc from COA where len(LevelAccountNo)=5)as Level2 " +
"where Level1.LevelAccountNo=left(COA.LevelAccountNo,2)and Level2.LevelAccountNo=left(COA.LevelAccountNo,5) and len(COA.LevelAccountNo)>6";
try
{
accCode = Convert.ToInt32(text);
query = query + " COA.LevelAccountNo like '" + text + "%'";
}
catch (Exception ex)
{
query = query + " COA.AccountDesc3 like '%" + text + "%'";
}
SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"].ToString());
// string constr=ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlDataAdapter adapter = new SqlDataAdapter(query, con);
// adapter.SelectCommand.Parameters.AddWithValue("@text", text);
DataTable data = new DataTable();
adapter.Fill(data);
con.Close();
return data;
}
我第一次在我的项目中使用webservice。我不知道如何解决这个错误。如果我运行的是aspx.cs,那么这是完美的运行,并且值绑定在组合框中。但当我使用web服务将值绑定到combobox时,它会给出一个错误:
不支持Telerik.Web.UI.radcomboxContext类型,因为它实现了IDictionary
出现此问题的原因是Visual Studio调试器。这是因为它的默认行为。有一个解决办法。换线
Collapse | Copy Code
<telerik:RadComboBox ID="cboAccount" runat="server" Height="200" Width="200" EmptyMessage="Select an Account"
EnableLoadOnDemand="true" ShowMoreResultsBox="true" EnableVirtualScrolling="true">
<HeaderTemplate>
<h3>Accounts</h3>
</HeaderTemplate>
<ClientItemTemplate>
<div>
<ul>
<li><span><b>Name:#= Text # </b></span></li>
<li><span>Level6 #= Attributes.Level6 # </span></li>
<li><span>Level1: #= Attributes.Level4 # </span></li>
<li><span>Level4 #= Attributes.Level1 # </span></li>
</ul>
</div>
<br></br>
</ClientItemTemplate>
<WebServiceSettings Method="GetAccount" Path="InvestmentDropDownWebService.asmx" />
</telerik:RadComboBox>
到
另外,添加一个属性
[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
在RadCombo框的ASPX代码中。
有关此问题的更多详细信息,请参阅。问题的原因是xmlserialization。 请记住,序列化机制是在平台一开始就构建的,之后添加了通用集合/字典。 这意味着,在最初的开发过程中,您希望现在可以使用的功能可能不可能实现 这就引出了字典。 字典的基类不支持序列化,因为序列化程序不太喜欢/处理“未知”类型。因为字典可以是“[object,object]”,所以它是未知类型 创建类似未知类型问题的有趣方法如下所示 创建期望类“a”作为参数的Web服务。 创建对服务的web引用。 创建从“a”派生的类“b”。 现在以“b”的实例作为参数调用webmethod 您现在将收到一条错误消息,说明调用失败是因为“类型b意外”。我希望你能看到这两件事是如何联系在一起的 您只能为xml序列化程序提供设计时要求它使用的类型 “sohaiby”的解决方案将起作用,因为他告诉Web服务不要使用xml序列化,而是使用JSON:
WebServiceSettings-UseHttpGet="true"
总而言之,这真的是Telerics的错,他们应该解决它。也许有人能回答你,但解决这个问题最好的地方是Telerik论坛。
WebServiceSettings-UseHttpGet="true"
ResponseFormat = ResponseFormat.Json