在数据绑定的范围内创建一个变量

本文关键字:一个 变量 数据绑定 范围内 创建 | 更新日期: 2023-09-27 17:54:44

我正在绑定一个中继器,我想在设计代码模板中访问一个变量。该变量将包含一些稍后在数据绑定操作中使用的信息。
理想情况下,变量的范围将被限制在"数据绑定操作"中。我可以简单地使用一个全局变量,但是,嘿,那将是作弊!

我尝试使用脚本块来定义变量,但这不起作用;该变量是在Repeater的模板范围之外创建的。

<% bool x; %>
<asp:Repeater ID="suggestionRepeater" runat="server">
   <ItemTemplate>
      <%# x = false %>  // x does not exist in current context
   </ItemTemplate>
</asp:Repeater>

<asp:Repeater ID="suggestionRepeater" runat="server">
   <HeaderTemplate>
       <% bool x; %>
   </HeaderTemplate>
   <ItemTemplate>
       <%# x = false %>  // x does not exist in current context
   </ItemTemplate>
</asp:Repeater>

那么,如果不采取简单的路线并使用全局(或受保护)变量,这可能吗?

在数据绑定的范围内创建一个变量

我认为你不能。至少在加价中没有。你可以使用隐藏字段作为另一个答案说(更新:另一个家伙后来删除了它!)和我通常在这样做的时候设置它可见false和viewstate false,但是嘿,为什么需要它…

你可以在数据绑定事件中做各种有趣的事情,但这与全局变量没有太大的不同。

但是,嘿,也许你正在试图解决错误的问题!记住,这是。net,不是c++。即使变量超出了作用域,它也只在需要时才被垃圾收集。即使是值类型对象,它能有多大?
另外,与中继器相比,整个页面的生命周期长多少?

如果对象确实"那么"昂贵,并且您"确实"知道一个很好的理由,您不希望它的寿命超过数据绑定,那么它也应该是一次性对象(以保证适当的清理资源),然后我可能会这样做:

protected MyObjectType MyObject;
protected void BindRepeater(IEnumerable someDataSource)
{
    using(MyObject = SomeClass.SomeMethodToGetObject())
    {
        myRepeater.DataSource = someDataSource;
        myRepeater.DataBind();
    }
}

这里using应该通过隐式调用Dispose()来保证清理。当然,它仍然是肮脏的,因为有人可以犯一个错误,并使用MyObject在另一个地方,当它被处置或不分配,即使我把注释和一切,它毕竟是一个全局变量-是的,它是作弊,或工作的限制。

再次强调,我并不建议您执行上面的代码。我只是说明,如果您确实知道为什么要这样做,那么这是可能的(否则,这被称为过早优化,您最终可能会获得相同的性能,甚至在尝试解决问题时性能略有下降,或者充其量只能获得非常微不足道的性能提高)。我的建议是再看一遍问题,确定你真的需要这个。

另一种解决这个问题的方法也是与最小化生命周期相反的,它实际上是增加生命周期,就像把对象放在缓存中或其他我们正在谈论的。这样您就不必创建多余的内容或存储许多相同的大副本,但这当然取决于数据类型

嗯,使用一个函数并在脚本块中调用它怎么样?

<%# SetMyBool(Eval("RowID")) %>  

并在该函数中定义bool ?或者返回一个布尔值?

<script language="VB" runat="Server"> 
        Dim rez As String
        public Function SetMyBool(v as string) As String
        rez=v
        End Function
</script>


<asp:Repeater runat="server" DataSourceID="dsRateSet">
<ItemTemplate>
<%# SetMyBool(Eval("result")) %>
</ItemTemplate>
</asp:Repeater>
<% =rez %>