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