Share
前面讲了模板的构建,我们忽略了一个细节,如果接触ASP.NET时间不长的话,一般都会看到数据表达式是<%#Eval(‘Name’)%>这种形式的,
那么我们为什么用<%#Container.Name%>这种形式呢,其实前者是ASP.NET控件所支持的一种简化写法,如果在自定义控件中支持简化写法,
需要实现IDataItemContainer接口 ,该接口包含3个需要实现的属性
DataItem:返回数据项的值
DataItemIndex:返回数据项在数据源中的索引
DisplayIndex:返回数据项在控件中的索引
那么创建数据绑定控件时实现IDataItemContainer可以将数据库表中每条记录封装到实现这个控件的对象中,这样就实现了简化的数据表达式引用了
看个简单的例子:
先声明一个非数据绑定控件
/// <summary>
/// 简单绑定
/// </summary>
public class SingleBindingsControl:CompositeControl
{
private ITemplate _itemplete;
private Items _item;
public string Name
{
get
{
EnsureChildControls();
return _item.Name;
}
set
{
EnsureChildControls();
_item.Name = value;
}
}
public Decimal Price
{
get
{
EnsureChildControls();
return _item.Price;
}
set
{
EnsureChildControls();
_item.Price= value;
}
}
[TemplateContainer(typeof(Items))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ItemTemplete
{
get
{
return _itemplete;
}
set
{
_itemplete = value;
}
}
protected override void CreateChildControls()
{
_item = new Items();
_itemplete.InstantiateIn(_item);
this.Controls.Add(_item);
}
}
这里声明的SingleBindingsControl控件通过一个ItemTempleate关联到Items类,在CreateChildControls()中,
ItemTempleate实例化到Items类中。
Items的实现
public class Items : WebControl, IDataItemContainer
{
public string Name { get; set; }
public decimal Price { get; set; }
public object DataItem { get { return this; } }
public int DataItemIndex { get { return 0; } }
public int DisplayIndex { get { return 0; } }
}
Items类实现了IDataItemContainer类,简单的实现其中的内容而已
看看其使用,很熟悉的方式
<custom:SingleBindingsControl ID="SingleBindings1" runat="server">
<ItemTemplete>
<%#Eval("Name") %>
<%#Eval("Price","{0:c}") %>
</ItemTemplete>
</custom:SingleBindingsControl>
</div>
添加一数据
this.SingleBindings1.Name = "Hello ,asp.net";
this.SingleBindings1.Price = 123.12M;
this.DataBind();
OK,一直用Eval()的朋友知道Eval的是怎么出来的了吧。。。
本文参《ASP.NET 3.5揭秘》