65.9K
CodeProject 正在变化。 阅读更多。
Home

PopupLookup 控件,AJAX 的替代方案?

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (4投票s)

2008年1月24日

CPOL

3分钟阅读

viewsIcon

34953

downloadIcon

321

使用这些便捷的控件从 1000000+ 条记录中获取 1 条记录。

PopupControl

引言

在我构建和见过的许多网站中,程序的流程需要查找信息。 一些网站使用 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 月。
© . All rights reserved.