【问题标题】:Referencing code-behind properties on .aspx page?引用 .aspx 页面上的代码隐藏属性?
【发布时间】:2013-12-23 10:46:50
【问题描述】:

在 .aspx 页面上,将服务器控件的属性链接到页面类的属性(其代码隐藏)的最佳方式是什么?我读过的唯一方法是使用数据绑定:

<asp:TextBox ID="txt" runat="server" Text='<%# Me.SomePropOfMine %>' />

然后从代码隐藏中调用Me.txt.DataBind()Me.Databind()。有没有办法单独在.aspx页面上建立这种关系,或者如果你有很多控件要绑定(不绑定整个页面)简化过程?

【问题讨论】:

  • 您有没有按预期工作?
  • 排序:在阅读您的答案之前,我通过创建一个简单的自定义控件来做到这一点:它继承了TextBox 并在其PreRender 事件期间调用了Me.DataBind。这给了我想要的效果,但显然不是一个理想的解决方案。

标签: .net asp.net vb.net code-behind


【解决方案1】:

您可以Databind() 整个Me 或容器控件(您也可以在所需控件周围添加PlaceHolder 控件)。因为DataBind() 在子控件上递归。

如果除此之外不需要 DataBinding,更好的方法是使用代码表达式绑定器

http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

这允许您使用&lt;%$ Code: Me.Property %&gt; 而不是&lt;%# Me.Property %&gt;

如果您根本不了解表达式构建器,请查看以下介绍文章: http://www.4guysfromrolla.com/articles/022509-1.aspx

请注意,&lt;%= Me.Property %&gt; 不适用于 &lt;asp:TextBox ... 等 Web 控件...

附言

Code 表达式生成器的唯一缺点是您没有智能感知。我通常通过在标记中写入&lt;%= Me.TestSomething %&gt; 来解决此问题以获取我的智能感知,然后在完成后将&lt;%= 替换为&lt;%$ Code:。烦人,但如果你不想走 DataBind() 路线(而且你不应该导致它可能与你想要做的现有真实数据绑定冲突。相信我,试图让这些工作是地狱),那么这个是要走的路。

【讨论】:

  • 啊太棒了——我不想使用Me.DataBind,因为它是一个母版页,这样做会干扰某些子页面,但数据绑定到占位符会起作用。不过,这种表达式构建器方法看起来更有前途,我会检查一下。谢谢!!
【解决方案2】:

有两件事:

  1. 如果要读取某些变量的值,请使用
  2. 您可以使用 Page.DataBind() 来绑定页面中的所有控件。

【讨论】:

    【解决方案3】:

    如果我真的需要这样做,我会使用CodeExpressionBuilder

    但问题是 - 为什么要在标记中而不是在代码中设置属性?如果它们是动态的并且与逻辑相关(并且可能是),那么即使看起来不方便,您也应该在代码中设置它们 - 这会将逻辑保留在一个地方,而将标记保留在另一个地方。

    【讨论】:

    • 我不喜欢使用代码隐藏的原因是它非常依赖于加载顺序——我无法在Page.Init 事件之前操作页面的控件,但只有一个控件需要在其(控件的)Init 期间访问某个字段,该字段发生在页面之前。出于这样的原因,我宁愿只向控件展示如何获取数据,而不是实际提供数据。
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多