将数据从 ASP.NET 页面传递到动态加载的 ASCX 用户控件

Posted

技术标签:

【中文标题】将数据从 ASP.NET 页面传递到动态加载的 ASCX 用户控件【英文标题】:Pass data from a ASP.NET page to ASCX user controls loaded dynamically 【发布时间】:2011-01-13 03:58:19 【问题描述】:

我正在使用 C# 和 Ajax 开发一个 ASP.NET 应用程序。

我有一个页面,其中包含动态加载的用户控件。我需要将一些数据(整数值和一些字符串)传递给已动态加载的用户控件。

现在我使用 Session 来传递这些值,但我想我可以使用另一种方式;类似于 VIEWSTATE 或隐藏输入。

你有什么推荐给我的?

更新:

动态加载控件这一事实很重要,因为每次回发都会加载控件,并且我无法在控件上存储任何值。

【问题讨论】:

【参考方案1】:

在您的用户控件上使用您要传递给它的数据的数据类型创建一个属性,并在创建控件时将其填充到您的页面中。

public class myControl : Control

  ...
  public int myIntValue get; set;
  ...

在后面的代码中:

myControl ctrl = new myControl();
ctrl.myIntValue = 5;

您也可以直接在标记中执行此操作:

<uc1:myControl ID="uc1" runat="server" myIntValue="5" />

【讨论】:

这是一个很好的答案,但我不能使用它,因为控件是动态加载的。也许我会使用隐藏字段。谢谢。 你应该使用 ViewState 来保持控件状态。 我怎样才能在 ViewState 上保存公共属性的值?我正在尝试这样做,但 myIntValue 始终为零。【参考方案2】:

在您的用户控件中设置公共属性。

public string TestValue  get;set;;

然后当您将用户控件放入您的 aspx 页面时:

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" />

您还可以更改后面代码中的值:

uc1.testValue = "some value";

【讨论】:

这是一个很好的答案,但我不能使用它,因为控件是动态加载的。也许我会使用隐藏字段。谢谢。【参考方案3】:

要真正回答你的问题,尽管其他人似乎不希望你这样做,我同意......我以前做过这种事情。

我要做的第一件事是让你的页面实现一个接口。

在控件中:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) //grab data from interface else throw YouCantPutThisControlOnThisKindOfPageException();

这不是最优雅的方式,但是当我们有很多控件想要共享一个非常昂贵的对象时,这符合要求。

这很好用,但它使您的控件在没有实现该接口的页面上无法使用——这使得控件与您的页面耦合过于紧密。其他人都说让页面从控件中获取数据是正确的;您将控件放在页面上,而不是控件中的页面。

你应该有一个很好的理由才能这样做。对我们来说:共享对象的负载是非常昂贵的,并且无论哪个控件在该对象上工作都让页面加载/保存它非常有用。

太糟糕了,很多没有真正实现接口的页面不得不被硬塞到提供某种支持或代理支持,只是为了让控件工作,并使页面和控件少得多可重复使用。

如果我必须重新执行此操作,我会让页面将数据发送到带有事件的控件,如果我需要偷懒的话,可能会通过反射。

【讨论】:

那么在用户控件上使用公共属性呢? 那行得通。 在耦合方面,事件或公共属性几乎相同。 很抱歉,如果我动态加载控件,我将无法使用公共属性。 你可以,但你必须通过强类型/界面来做到这一点......但这会带来耦合问题。【参考方案4】:

您必须在每次回发时重新加载这些控件...阅读一下。这可能会有所帮助。

Dynamic Web Controls, Postbacks, and View State

【讨论】:

【参考方案5】:

有点违背了使用 ascx 控件 IMO 的目的,因为这破坏了控件封装。您的页面应该通过订阅控件发布的事件从控件获取数据。

【讨论】:

【参考方案6】:

可以在 HttpContext.Items 集合中设置值并在控件中读取它们。这就像使用 Session 一样,只是它只对每个请求可用,而不是在整个会话生命周期内可用。

http://www.4guysfromrolla.com/articles/060904-1.aspx

恕我直言,这有点懒惰,但在某些情况下它可能是一个很好的解决方案。

【讨论】:

以上是关于将数据从 ASP.NET 页面传递到动态加载的 ASCX 用户控件的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 javascript 传递到 asp.net core 2 razor 页面方法

ASP.NET怎么将本页面内的某个参数传递到另一个页面中呢?

将多个参数从 ajax post 传递到 asp.net mvc 控制器

将 Html 字符串从控制器传递到查看 ASP.Net MVC

如何在 ASP.NET Core Razor 页面中绑定复杂列表

在 asp.net 中动态加载 CSS 元素