介绍 当我们需要表示层次数据集中的数据时,本文将创建一个链式下拉列表。在这里,我将讨论使用AJAX部分页面呈现来填充ASPX下拉列表的方法。我的数据库是一个简单的XML数据文件。 背景 这篇文章是对我在另一篇文章中提出的“使用jQuery和XML创建链式下拉列表”[1]的回应。询问者想知道在为链式下拉列表编程时使用jQuery的安全问题。 我说,‘是的,安全问题是存在的,我们在客户端工作时总是存在这些问题,我们无法同时消除它们’。在使用jQuery方法时,我发现它无法使用Web保护我的XML数据文件(它在一个单独的文件夹中)。可以拒绝所有用户进入该文件夹的配置文件。 因此,如果您的数据不是关键的,为了性能而进行的这种大幅安全性不是一个坏主意,但如果数据本质上是关键的,最好使用服务器端编程。在本文中,我使用ASPX下拉列表,我的XML数据文件位于一个受保护的文件夹中。我将使用AJAX,这样我就可以通过获得部分页面渲染来提高性能,此外,我还展示了一个部分更新进度条,以缓解用户正在发生的事情。 现在的问题是选择哪个——XML数据文件还是SQL Server数据库。这个问题的答案浮现在我的脑海中,‘当我们有小而静态的数据集时,最好使用XML数据文件,因为它消除了不必要的往返网站的数据库服务器。但对于大型且动态变化的数据集,我们需要通过索引增加数据检索的能力,这在任何核心数据库语言(如SQL Server)中都是可用的。所以在后一种情况下,使用SQL Server比使用XML更好。” 使用的代码 在这个演示程序中,我使用了一个。dll文件Microsoft.Web.Preview.dll。这必须添加到Bin文件夹的程序,以实现部分页面更新进度面板的功能。接下来是XML文件(Motors.xml),它位于带有Web的“XMLFiles”文件夹中。配置文件稍后反对对Motors.xml的访问。 在违约。aspx页面,有三个下拉列表,一个按钮,一个UpdateProgress控件(我们为它添加了.dll文件)和一个标签来显示结果。所有这些都包含在UpdatePanel控件中,通过设置属性ChildrenAsTriggers= " true "。这意味着从包含的任何控件触发的任何事件都会异步回发到服务器。UpdateProgress控件的显示/隐藏由jQuery代码管理: 隐藏,复制Code
var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_initializeRequest(InitializeRequest); prm.add_endRequest(EndRequest); function InitializeRequest(sender,args) { $get('chainUpdate').style.display = 'block'; } function EndRequest(sender,args) { $get('chainUpdate').style.display = 'none'; }
在上面的代码中,chainUpdate是UpdateProgress control的ID,有两个函数,第一个是在异步回发初始化时调用,下一个是在调用结束时调用。 现在,我将讨论代码隐藏页面上的代码。在页面加载事件,我加载我的XML文件在dataset和添加它到缓存以提高性能。下一个事件调用是在零级下拉列表(drpMain)上,当所选索引被更改时。handler函数如下: 隐藏,收缩,复制Code
protected void drpMain_SelectedIndexChanged(object sender, EventArgs e) { System.Threading.Thread.Sleep(1200); if (drpMain.SelectedValue == "0") { drpMoto.Items.Clear(); drpBrand.Items.Clear(); drpMoto.Enabled = false; drpBrand.Enabled = false; btnGo.Enabled = false; } else if (drpMain.SelectedValue == "1") { drpMoto.DataTextField = "mcname"; drpMoto.DataValueField = "mcid"; drpMoto.DataSource = ds.Tables["motoc"]; drpMoto.DataBind(); drpMoto.Enabled = true; drpBrand.Items.Clear(); drpBrand.Enabled = false; btnGo.Enabled = false; } else if (drpMain.SelectedValue == "2") { drpMoto.DataTextField = "mbname"; drpMoto.DataValueField = "mbid"; drpMoto.DataSource = ds.Tables["motob"]; drpMoto.DataBind(); drpMoto.Enabled = true; drpBrand.Items.Clear(); drpBrand.Enabled = false; btnGo.Enabled = false; } }
上面处理程序中的第一行用于将线程暂停1200毫秒,这是UpdateProgress控制显示的最小时间。您可以根据您的需求更改它。 现在有一个selectedvalue检查是否为默认项(零)。如果默认的项目已经被选中,项目在下拉列表中的级别1 (drpMoto)和级别2 (drpBrand)是清除这些下拉列表和Go按钮。 在第二个条件,当selectedvalue是1,这是下拉列表中选择第二项drpMain(汽车在我的例子中)汽车已经从数据库中提取相关数据,以使下拉列表(drpMoto) DataTextField和DataValueField不断变化的属性值。现在列表drpMoto启用了。 在第三个条件中,当选择的值为2时(在我的例子中是自行车),与自行车相关的数据被提取并绑定到第1级的下拉列表(drpMoto),并启用该列表。 你会看到在所有的选择变化,整个页面不回发回服务器,有部分回发与提供一个缓解UpdateProgress控制。 现在的时间是讨论事件处理程序编写时,有一个变化的选择在Level1下拉列表(drpMoto),如下所示: 隐藏,收缩,复制Code
protected void drpMoto_SelectedIndexChanged(object sender, EventArgs e) { System.Threading.Thread.Sleep(1200); if (drpMoto.SelectedItem.Value == "0") { drpBrand.Items.Clear(); drpBrand.Enabled = false; btnGo.Enabled = false; } else if (drpMain.SelectedValue == "1" && drpMoto.SelectedItem.Value != "0") { DataView dView = new DataView(ds.Tables["motocb"]); dView.RowFilter = "mcid='" + drpMoto.SelectedValue.Trim() + "'"; dView.Sort = "mcbname asc"; drpBrand.DataTextField = "mcbname"; drpBrand.DataValueField = "mcbid"; drpBrand.DataSource = dView; drpBrand.DataBind(); drpBrand.Enabled = true; btnGo.Enabled = true; } else if (drpMain.SelectedValue == "2" && drpMoto.SelectedItem.Value != "0") { DataView dView = new DataView(ds.Tables["motobb"]); dView.RowFilter = "mbid='" + drpMoto.SelectedValue.Trim() + "'"; dView.Sort = "mbbname asc"; drpBrand.DataTextField = "mbbname"; drpBrand.DataValueField = "mbbid"; drpBrand.DataSource = dView; drpBrand.DataBind(); drpBrand.Enabled = true; btnGo.Enabled = true; } }
在上面的处理程序中,prime有两个条件检查。第一个是当selectedvalue在drpMoto下拉列表中为0时,另一个是当selectedvalue在drpMoto下拉列表中为非0时。此外,在下拉列表drpMoto中,如果selectedvalue在dr下拉列表中为1,则有两种情况下选中的值是非零pMain(汽车)或它是2(自行车)。 在drpMoto中selectedvalue为0的第一个条件下,drpBrand中的项目已经被清除,drpBrand和btnGo都被禁用。 在第二个条件中,我们需要提取汽车的所有品牌节点并过滤它们以便在drpMoto中进行选择。然后下拉列表在第2级(drpBrand)被绑定,drpBrand和btnGo被启用。 在第三个条件中,我们需要提取自行车的所有品牌节点,并过滤它们以便在drpMoto中进行选择。然后下拉列表在第2级(drpBrand)被绑定,drpBrand和btnGo被启用。 现在所有下拉列表填充和启用按钮。当按钮被单击时,代码隐藏页面上的最终处理函数被触发,如下所示: 隐藏,复制Code
protected void btnGo_OnClick(object sender, EventArgs e) { lblResult.Text = "Searched for: " + drpBrand.SelectedItem.Text.Replace("(","").Replace(")","") + " " + drpMoto.SelectedItem.Text + " " + drpMain.SelectedItem.Text.Replace("s","") + "(s)"; }
上面的处理程序用于在label字段中显示结果。 的兴趣点 实际的东西附上作为演示。当您查看下载的附件时,您将很容易理解。在这里,您可能对在客户端使用jQuery填充下拉列表感兴趣,请浏览我的文章,使用jQuery和XML创建链式下拉列表。 最后的话 我希望这些东西对你有帮助。感谢你的阅读。好运! 本文转载于:http://www.diyabc.com/frontweb/news170.html