我正在使用LoadControl(“src to file”)动态地将控件加载到页面。
在usercontrol中,我有一个验证器和一些其他控件,我想从我的页面访问。我无法让它工作,空指针异常。
情景是这样的。我有一个Edit.aspx页面,它加载EditTemplate.ascx usercontroll。我想从Edit.aspx站点获取信息或在EditTemplate中找到控件。
我尝试将控件和验证器公开为属性,但是如何从Edit.aspx中访问它们?
示例代码:
Edit.aspx,控件稍后被添加到
中Control control = LoadControl("src to ascx");
TemplatePlaceHolder.Controls.Add(control);
EditTemplate.ascx
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="CompanyImageFile" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator>
代码隐藏
public partial class EditTemplate : System.Web.UI.UserControl, IEditTemplate {
public RequiredFieldValidator Validator {
get { return this.RequiredFieldValidator1; }
set { this.RequiredFieldValidator1 = value; }
}
从Edit.aspx网站,我想检查验证器isValid属性。在Save方法中设置了Isvalid。
保存模板的保存按钮位于edit.aspx中,因此从该页面完成了帖子。
所以问题是如何从edit.aspx页面中的usercontrol获取属性,在哪里以及如何完成?
再次感谢。
答案 0 :(得分:1)
最简单的方法是让用户控件定义属性,如:
public IValidator SomeValidator {
get { return this.cuvValidator; }
set { this.cuvValidator = value; }
}
public string Text {
get { return this.txtText.Text; }
set { this.txtText.Text = value; }
}
您的编辑页面可以使用。
HTH。
答案 1 :(得分:1)
您始终可以使用递归方法。检查Steve Smith博客上的解决方案:
答案 2 :(得分:0)
如前面的答案中所述,我会将您必须从父ASPX页面访问的任何验证器公开为用户控件中的属性。
public RequiredFieldValidator ValidatorToCheck
{
get { return this.rfvMyField; }
}
然后,您可以将用户控件动态添加到某个占位符(确保为用户控件分配ID)。
// In my example, this is occurring in the Page_Load event
Control control = LoadControl("~/Controls/EditTemplate.ascx");
control.ID = "ucEditTemplate";
pnlControlHolder.Controls.Add(control); // the placeholder in my example is a panel
当您想要访问给定验证器上的IsValid属性时(可能在您的保存操作中),您可以执行以下操作(确保将控件转换为适当的类型并使用您最初分配给用户控件的ID ):
EditTemplate control = (EditTemplate)pnlControlHolder.FindControl("ucEditTemplate");
if (control.ValidatorToCheck.IsValid)
{
// Some action
}