在数据绑定的范围内创建一个变量
本文关键字:一个 变量 数据绑定 范围内 创建 | 更新日期: 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 %>