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