我正在对Repeater进行数据绑定,我希望能够访问设计代码模板中的变量。该变量将包含一些信息,供以后在数据绑定操作中使用 理想情况下,变量的范围将限于“数据绑定动作”。我可以简单地使用一个全局变量,但是,嘿,那就是作弊!
我尝试使用脚本块来定义变量,但这不起作用;变量是在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>
如果不采用简单的路线并使用全局(或受保护的)变量,这是否可行呢?
答案 0 :(得分:1)
嗯,如何使用函数并在脚本块中调用它?
<%# SetMyBool(Eval("RowID")) %>
并在该函数中定义bool?如果你愿意,还是返回一个布尔值?
答案 1 :(得分:1)
我想你不能。反正不在标记中。你可以使用一个隐藏字段作为另一个答案说(更新:其他人稍后删除它!)我通常在做这样设置时它可见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
即使我放了评论和所有内容,它毕竟是一个全局变量 - 是的,这是作弊,或解决限制。
同样,我不是建议你做上面的代码。我只是表明,如果你真的知道为什么要这样做(或者,它被称为过早优化,你可能最终会得到相同的性能,甚至在尝试解决问题时性能稍差,或者至多变得非常微不足道)性能提升)。我在这里建议的是再次查看问题并确保你真的需要这个。
解决这个问题的另一种方法与最小化生命周期完全相反,它实际上是在增加生命周期,比如把对象放在缓存中或者我们正在谈论的东西。所以你不必创建它超过需要或存储许多相同的大型副本,但这当然取决于什么样的数据
答案 2 :(得分:0)
<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 %>