很早之前,我一般在aspx中放置控件,在后台的代码中用代码直接给相应的控件设置属性的值。这样的方法优点是灵活,可以依据业务逻辑,灵活的设置控件的Text以及Visible。示例如下:
<table>
<tr>
<td>
用户名
</td>
<td>
<asp:TextBox ID="tbName" runat="server" ></asp:TextBox>
</td>
</tr>
</table>
然后后台里写代码:<tr>
<td>
用户名
</td>
<td>
<asp:TextBox ID="tbName" runat="server" ></asp:TextBox>
</td>
</tr>
</table>
protected User OperData
{
get;
set;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.tbName.Text = OperData.Name;
}
}
不久之前,我发现在写好多字段的如果都这样写的话,会很累的,虽然效率会很高。所以我尝试采用如下的方式:{
get;
set;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.tbName.Text = OperData.Name;
}
}
尽可以的避免在代码中直接写来给控件属性设置值,而通过前台的绑定来实现,如:
<asp:TextBox ID="TextBox1" runat="server" Text='<%#OperData.Name %>'></asp:TextBox>
不过,这样的话,在后台也应该至少有一句绑定操作,像这样: protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.DataBind();
}
}
虽然绑定上了,但这里有一个问题,我们的页面上的控件,不是都是在 !Page.IsPostBack这个条件的时候要绑定,也许还要有别的要求。还有,既然已经Page.IsPostBack也是条件,我们要是不用在后台代码里写this.DataBind不是更好吗?{
if (!Page.IsPostBack)
{
this.DataBind();
}
}
其实,说难也不难,我们来实现一个控件,这个控件用来自动绑定,且分条件的绑定。下面看下代码:
namespace Iyond.Web.UI.WebControls
{
public class NullPanel : Panel
{
private bool _autoBind = true;
public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
{
//因为NULL吗,所以什么也不输出
//base.RenderBeginTag(writer);
}
public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
{
//因为NULL吗,所以什么也不输出
//base.RenderEndTag(writer);
}
protected override System.Web.UI.HtmlTextWriterTag TagKey
{
get
{
return System.Web.UI.HtmlTextWriterTag.Unknown;
}
}
[DefaultValue(true)]
public bool AutoBind
{
get
{
return _autoBind;
}
set
{
_autoBind = value;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//重置显示属性,好引发 OnPreRender
this.Visible = true;
}
protected override void DataBindChildren()
{
//分条件绑定子控件,条件就是:
if (this.Visible && this.AutoBind)
{
base.DataBindChildren();
}
}
protected override void OnPreRender(EventArgs e)
{
//在这里,我们要给数据绑定数据,不知道这个位置是不是最好
if (this.AutoBind)
{
this.DataBind();
}
base.OnPreRender(e);
}
}
}
有了上面这个控件,我现在可以像下面一样写代码:{
public class NullPanel : Panel
{
private bool _autoBind = true;
public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
{
//因为NULL吗,所以什么也不输出
//base.RenderBeginTag(writer);
}
public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
{
//因为NULL吗,所以什么也不输出
//base.RenderEndTag(writer);
}
protected override System.Web.UI.HtmlTextWriterTag TagKey
{
get
{
return System.Web.UI.HtmlTextWriterTag.Unknown;
}
}
[DefaultValue(true)]
public bool AutoBind
{
get
{
return _autoBind;
}
set
{
_autoBind = value;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//重置显示属性,好引发 OnPreRender
this.Visible = true;
}
protected override void DataBindChildren()
{
//分条件绑定子控件,条件就是:
if (this.Visible && this.AutoBind)
{
base.DataBindChildren();
}
}
protected override void OnPreRender(EventArgs e)
{
//在这里,我们要给数据绑定数据,不知道这个位置是不是最好
if (this.AutoBind)
{
this.DataBind();
}
base.OnPreRender(e);
}
}
}
<asp:NullPanel ID="panelFenInfo" runat="server"
Visible='<%#this.IsEditMode%>' >
<asp:TextBox ID="tbName" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
<asp:NullPanel ID="panelInfo" runat="server"
Visible='<%#!Page.IsPostBack%>' >
<asp:TextBox ID="tbCompany" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
后台代码,这时就不用写了。Visible='<%#this.IsEditMode%>' >
<asp:TextBox ID="tbName" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
<asp:NullPanel ID="panelInfo" runat="server"
Visible='<%#!Page.IsPostBack%>' >
<asp:TextBox ID="tbCompany" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
写到这里,不知道大家看明白没有,我的文笔可真差,希望大家多在评论中指出。