ASP.NET控件可见性困境

本文关键字:困境 可见性 控件 NET ASP | 更新日期: 2023-09-27 18:25:57

我有一个Page,一个使用带有SelectMethodDropDownListObjectDataSourceGridViewSelectMethod获得一个包含多个ID的字符串数组(用于过滤数据),但我也需要它作为DropDownListDataSource。遗憾的是,我不能在SelectMethodDataBindDropDownList,因为它是空的。一个想法是将这个string[]绑定到一个Session-变量,但如果我想在数据库发生变化时更新它,我必须在每个Page_Load上重新设置它,或者在每隔一页的Session中删除它。

我要找的是Page_LoadObjectDataSourceSelectMethod中都可用的某种变量,但它在离开页面时会自行删除(即导航到Web应用程序上的任何其他页面(最好不必在其他页面上调用方法)。

我希望你能理解我的问题。

谢谢,

Dennis

ASP.NET控件可见性困境

据我所知,提取字符串数组的需要源于单独的往返将导致的性能打击。要解决此问题,您可以创建一个单独的对象来提供对象数据源。这个对象将有两种方法,一种用于获取字符串数组,另一种用于获得网格的数据(即选择方法)

然后,您可以将这样的对象放在页面中,并以惰性的方式获取其中的数据。如果对象调用任何数据,它会将另一部分存储在字段中。然后,您可以使用ObjectDataSource ObjectCreating事件将页面上的此对象传递给ObjectDataSource

protected void odsSomething_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
    e.ObjectInstance = YourInsntanceAlreadyInThePage;
}

这样你就可以避免往返。

还可以考虑使用异步客户端调用同时进行两个web服务调用,这样就可以同时进行两次调用。这是否可行取决于你的逻辑流程。

我要找的是某种变量,它在Page_Load和我的ObjectDataSourceSelectMethod中都可用,但在离开页面时会删除它自己(即导航到Web应用程序上的任何其他页面(最好不必在其他页面上调用方法)。

在类似的情况下,我使用了当前HttpContextItems属性。它是一个IDictionary(非通用),因此可以保存由任意object s键控的任意object s,并且它的生存期正是当前请求的持续时间,因此一旦请求结束就会消失。使用:

// Where you first get the data
HttpContext.Current.Items["SomeKey"] = new [] { "string1", "string2" };
// Where you want to to use the data
var strings = (string[])HttpContext.Current.Items["SomeKey"];