PopupLookup 控件,AJAX 的替代方案?
使用这些便捷的控件从 1000000+ 条记录中获取 1 条记录。
引言
在我构建和见过的许多网站中,程序的流程需要查找信息。 一些网站使用 AJAX 从 100000+ 条记录中检索记录。 但是,此解决方案使用经典的但可行的弹出表单来搜索和选择该单个记录。
我还希望此控件可以与不同的业务对象一起使用。 这些业务对象必须动态创建。 这是在一个工厂中使用一点反射来完成的。
此演示应用程序包含一个 Web 表单、一个用户控件和一个弹出表单。 Web 表单包含用户控件。 实际上,此演示包含三个此类用户控件,它们填充有不同类型的数据。 用户控件是一个处理弹出表单的容器。 它包含一个只读文本框,选择的内容将放置在其中,以及一个“搜索”按钮,该按钮应该打开弹出表单并使其获得焦点。 然后,用户输入一个搜索字符串并单击“搜索”按钮。 结果显示在 DataGrid
中。 选择一条记录会关闭弹出表单,并且选定的记录将在原始 Web 表单中找回。 用户控件是使用一组专门定义的属性构建的,因此它可以与各种元数据一起使用。 因此,例如,组织可以使用与社会保障号码相同的控件来“查找”。
背景
此解决方案是 ASP 网站迁移到 .NET 的一部分。 用户习惯于在屏幕上获取新的 Web 表单并在该表单中选择某些记录。 必须在 .NET 中重建此界面。
使用代码
该控件使用 JavaScript 来显示一个新窗口。 在此窗口中,将显示一个带有按钮的文本框。 输入文本并按下按钮将填充 GridView
。 单击 GridView
中的一条记录将关闭窗口 (JavaScript) 并将选定的记录填入原始字段。
因为该控件用于不同的业务对象,只要它使用预定义的数据集,它就必须创建不同的业务对象,因此,它使用一个简单的工厂。 该数据集包含一个具有文本、值和描述的表。 通常,这已经足够了。 可以使用属性在弹出表单中禁用该值。 因此,例如,对于软件,您只能看到文本和描述,但对于组织,还会添加一个值。 工厂使用反射,并在命名空间 business
中查找与 ASPX 页面中给定的名称相同的类。 因此,如果需要一个 person-popup-lookup-form,则类型为 person
,并且工厂在命名空间 business
中找到字符串 person
并创建它。 以下是工厂代码
public static IBusiness Create(string businessName)
{
Assembly a = Assembly.GetExecutingAssembly();
Type[] types = a.GetTypes();
foreach (Type t in types)
{
if (t.Namespace == "Business")
{
if (t.FullName.EndsWith(businessName))
{
return Activator.CreateInstance(t) as IBusiness;
}
}
}
throw new ApplicationException(string.Format("Business object" +
" [{0}] not known", businessName));
}
接口 IBusiness
具有业务对象弹出表单所需的所有方法。
关注点
设置文本框的只读属性会禁用 viewstate 功能。 我使用它来记住回发期间的值。 为了解决缺少 viewstate 的问题,我不得不将文本框的值放在另一个特殊的隐藏值控件中,不幸的是。 该控件称为 hiddenText
,如果您在代码中寻找它的话。
另一个值得关注的点是在 JavaScript 中。 Firefox 要求首先关闭弹出表单,然后通过调用 window.opener.InsertValue
插入值。 奇怪... IE 没有这个要求。
function LocalSelect(str_Text, str_Value)
{
var objForm = window.document.forms[0];
var objHiddenText = objForm["hiddenTextId"];
var objShownText = objForm["shownTextId"];
var objHiddenValue = objForm["hiddenValueId"];
if (!window.opener) {
alert('No more valid reference in calling form');
window.close();
return;
}
if (!window.opener.InsertValue) {
alert('The calling form does not contain ' +
'an implementation of InsertValue(params)');
window.close();
return;
}
//alert('First CloseWindow! After that insertvalue ' +
// 'or else this window will not work in firefox');
CloseWindow();
window.opener.InsertValue(objHiddenText.value, objShownText.value,
str_Text, objHiddenValue.value, str_Value);
}
我找到了以下行来禁用 Web 浏览器的自动完成功能。 这对于禁用特定控件的自动完成功能非常有用。
this.txtSearch.Attributes.Add("autocomplete", "off");
就是这些了。 我希望你喜欢它,并且会使用该控件。 请给我一些反馈并教我一些我不知道的技巧。 再见。
历史
- 1.0 版,2008 年 1 月。