我正在尝试找到一种方法来做一些我认为必须可行的事情,但我只是错过了重点 - 所以希望有人能给我一点插入 :)
我在 ASP.NET 中使用数据绑定(bind)(viewstate 关闭 - 所以在这里和那里使用 controlstate 做一些事情)来呈现一个在每个项目模板(repeaterPriceBands)中都有一个转发器的转发器(repeaterPriceClasses)。基本上,这会在每个单元格中呈现一个由一些文本和一个下拉列表组成的表格。
我正在尝试找到一种方法来枚举按钮事件处理程序中的 repeaterOuter,以便为我提供一个列表,其中包含所有最初绑定(bind)的元素,这些元素现在有一个值为 >0 的下拉列表,以及什么这个值是。
public Dictionary<Price, int> SelectedPrices
{
get
{
var sel = new Dictionary<Price, int>();
foreach(RepeaterItem itemClass in repeaterPriceClasses.Items)
{
var repeaterPriceBands = itemClass.FindControl("repeaterPriceBands") as Repeater;
foreach(RepeaterItem itemBand in repeaterPriceBands.Items)
{
var context = (Price)itemBand.DataItem;
var listQty = itemBand.FindControl("listQty") as DropDownList;
if(listQty.SelectedValue.ToInt32() > 0)
{
sel.Add(context, listQty.SelectedValue.ToInt32());
}
}
}
return sel;
}
}
现在失败了,因为数据绑定(bind)完成后 itemBand.DataItem 始终为 null。
我应该使用什么技术来解决这个问题?
包含主键的隐藏字段 (不理想,因为会被滥用并添加 页面权重)
查找自 基于索引的原始缓存数据 (只是看起来不对)
或者什么的 否则/更好...?
编辑:我是否可以提供更多信息来帮助解决这个问题?
最佳答案
当 DataItem 可用时,您可以尝试在 ItemDataBound 事件中向 HTML 元素添加额外的属性。
ddlSomething.Attributes["Attribute1"] = dataItemObject.PropertyName;
[编辑] 除了使用属性之外,您还可以为每一行呈现一些包含 JSON 对象的数组。
var repeaterItemAttributes = [ { Prop1: val1, Prop2: val2, ... }, { ... }, ... ]
因此,通过使用它,您不必呈现属性,并且您的代码也将符合 XHTML(虽然不是必需的)。然后您可以遍历对象数组并读取您喜欢的任何属性。您还可以将您正在谈论的轻度加密应用于属性值。 [/编辑]
关于c# - 数据绑定(bind)后(在事件处理程序期间)从 RepeaterItem 检索 DataItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/748677/