我不想使用Web服务来填充文本框中的自动完成扩展程序。在这种情况下,它是用户输入国家/地区名称的地方,我不想每次都去数据库。我宁愿将一个集合保持在会话状态,并将自动完成“绑定”到那个。
是否可以将ServicePath和/或ServiceMethod设置为代码隐藏中的某些内容而不是Web服务?
此致 库马尔
答案 0 :(得分:1)
不幸的是,除了入侵javascript以阻止浏览器拨打电话获取列表之外,没有直接的选择。
我能看到的另一个选择是创建一个网络服务&使用EnableCaching
的{{1}}属性,以确保Web服务的结果缓存在客户端上,从而避免调用webservice(和数据库)。
编辑:再想一想,我认为可以在页面中使用AutoCompleteExtender
属性&标记公共静态方法。将WebMethod
设置为您的aspx页面。
我认为它应该有效。但我不确定,如果框架要求它是 webservice。
答案 1 :(得分:0)
您的国家/地区列表是否会更改,或因用户而异?将它置于会话状态似乎没有意义。我不明白为什么你应该为此服务器。
考虑将所有值直接渲染到HTML中,然后使用Javascript完全在客户端自动完成。
答案 2 :(得分:0)
您可以在现有Web项目中使用本地asmx文件并连接到该文件。在那里你可以放置你需要的任何逻辑,这样你就不必在不想要的情况下点击数据库了。这真的就像另一个网页应该没有问题访问会话状态。
答案 3 :(得分:0)
你可以将onclientpopulating属性设置为你的本地javascript函数,例如onclientpopulating =“onPopulating”,然后在js函数中提供本地数据而不是点击web服务。下面是我使用的实现之一,它永远不会访问Web服务。 completionData变量保存所有数据,我根据用户在文本框中输入的内容迭代查找匹配项。这是一个古老的例子。如果我现在实施它,我可能会做的不同。
function onPopulating(ace, args)
{
var prefixText = ace._currentCompletionWord();
var filteredItems = GetFilteredItems(prefixText);
ace._update(prefixText,filteredItems,false);
args.set_cancel(true);
}
function GetFilteredItems(prefixText)
{
var filteredItems = [];
for (var nCount=0; nCount < completionData.length; nCount ++)
{
if (completionData[nCount].startsWith(prefixText))
{
Array.add(filteredItems,completionData[nCount]);
}
}
return filteredItems;
}