我正在使用 C# 和 Ajax 开发一个 ASP.NET 应用程序。
我有一个页面,其中包含动态加载的用户控件。我需要将一些数据(整数值和一些字符串)传递给已动态加载的用户控件。
现在我使用 Session 来传递这些值,但我认为我可以使用另一种方式;诸如 VIEWSTATE 或隐藏输入之类的东西。
你给我推荐什么?
更新:
我动态加载控件这一事实很重要,因为每次回发时都会加载控件,并且我不能在控件上存储任何值。
我正在使用 C# 和 Ajax 开发一个 ASP.NET 应用程序。
我有一个页面,其中包含动态加载的用户控件。我需要将一些数据(整数值和一些字符串)传递给已动态加载的用户控件。
现在我使用 Session 来传递这些值,但我认为我可以使用另一种方式;诸如 VIEWSTATE 或隐藏输入之类的东西。
你给我推荐什么?
更新:
我动态加载控件这一事实很重要,因为每次回发时都会加载控件,并且我不能在控件上存储任何值。
在您的用户控件上使用您要传递给它的数据的数据类型创建一个属性,并在创建控件时将其填充到您的页面中。
public class myControl : Control
{
...
public int myIntValue {get; set;}
...
}
在后面的代码中:
myControl ctrl = new myControl();
ctrl.myIntValue = 5;
您也可以直接在标记中执行此操作:
<uc1:myControl ID="uc1" runat="server" myIntValue="5" />
在您的用户控件中设置公共属性。
public string TestValue { get;set;};
然后当你把你的用户控件放在你的 aspx 页面中时:
<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" />
您还可以更改后面代码中的值:
uc1.testValue = "some value";
您必须在每次回发时重新加载这些控件...阅读一下。它可能会有所帮助。
要真正回答你的问题,就像其他人似乎不希望你这样做一样,我同意......我以前做过这种事情。
我要做的第一件事是让您的页面实现一个接口。
在控制中:
IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage;
if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();
这不是最优雅的方式,但是当我们有很多控件想要共享一个非常昂贵的对象时,这符合要求。
这很好用,但它会使您的控件在没有实现该接口的页面上无法使用——这使得控件与您的页面耦合过于紧密。其他人都说让页面从控件中获取数据是正确的;您将控件放在页面上,而不是控件中的页面。
你应该有一个很好的理由才能做到这一点。对我们来说:共享对象的负载非常昂贵,无论哪个控件在该对象上工作,让页面加载/保存它都非常有用。
太糟糕了,许多没有真正实现接口的页面必须被硬塞到提供某种支持或代理支持才能使控件工作,并使页面和控件的可重用性大大降低。
如果我不得不再次这样做,我会让页面将数据发送到带有事件的控件,如果我需要偷懒的话,可能通过反射。
有点违背了使用 ascx 控件 IMO 的目的,因为这破坏了控件封装。您的页面应该通过订阅控件发布的事件从控件获取数据。
您可以在 HttpContext.Items 集合中设置值并在控件中读取它们。这就像使用 Session 一样,只是它仅适用于每个请求,而不适用于整个会话生命周期。
http://www.4guysfromrolla.com/articles/060904-1.aspx
恕我直言,这有点懒惰,但在某些情况下它可能是一个很好的解决方案。