原来的实现方法:
父页面aspx:
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!IsPostBack)
{
InitPage();
LoadData();
//Response.Write("<h3>首次加载</h3>");
}
else
{
//Response.Write("<h3>数据回发</h3>");
}
}
catch (Exception ex)
{
ProcessException(ex, true);
}
}
其中LoadData方法中实现了对用户控件的初始化并给ProjectCode赋值
this.AuctionRent1.InitControl();
LogHelper.Info("InitBidding1 projectcode:" + this.AuctionRent1.ProjectCode);
AuctionRent1是用户控件的id值。
用户控件ascx相关代码:
/// <summary>
/// 项目编号
/// </summary>
public string ProjectCode
{
get;
set;
}
public void InitControl()
{
if (this.State == "edit")//可操作的
{
LoadData(true);
EyeableDiv.Visible = false;
OperableDiv.Visible = true;
}
else if (this.State == "view")//可见的
{
LoadData(false);
OperableDiv.Visible = false;
EyeableDiv.Visible = true;
}
else
{
this.Visible = false;
}
}
initcotrol方法中LoadData实现了对ProjectCode的赋值
这种设计我在aspx页面的按钮事件中却获取不到ProjectCode的值
这里获取到的用户控件中的ProjectCode值为空。通过分析发现
this.AuctionRent1.InitControl();
LogHelper.Info("InitBidding1 projectcode:" + this.AuctionRent1.ProjectCode);
在这里是可以获取到用户控件中projectCode的值。但是在btnAddDtl_ServerClick按钮事件中却获取不到值。这是因为此时处于数据回发状态。数据回发时ProjectCode只有初始值null。并未赋值。若要改变此状况,使用viewstate对ProjectCode的get和set方法进行改造,可避免此问题。使其可以在按钮事件中能正确获取rojectCode值
private string _ProjectCode = string.Empty;
/// <summary>
/// 项目编号
/// </summary>
public string ProjectCode
{
get
{
if (_ProjectCode == string.Empty)
{
if (this.ViewState["_ProjectCode"] != null)
return this.ViewState["_ProjectCode"].ToString();
return "";
}
return _ProjectCode;
}
set
{
_ProjectCode = value;
this.ViewState["_ProjectCode"] = value;
}
}
这样设计就没此问题了