动态创建必需的字段验证器的问题

时间:2013-11-18 09:20:27

标签: c# asp.net class webforms code-behind

我在数据库中存储设置,需要验证对象以及属性。为此,我希望从一个在页面加载时调用的类动态创建它们。

我可以使用我认为正确的最小属性从类中创建验证器,但之后它们显然不起作用,当我提交时,我在摘要中没有收到任何错误消息。

我已经在下面提交了我的最后一次尝试,这表明我试图将它们添加到占位符中。

//In the class.

 public class ObjectSetup
    {
        static public DataTable GetPageValidators(int PageID)
        {
            DataTable dt = new DataTable();

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GetConnector"].ConnectionString))
        {
            DataSet ds = new DataSet();
            SqlCommand sqlComm = new SqlCommand("PL_Objects_Validation_Get", conn);
            sqlComm.Parameters.AddWithValue("@PageID", PageID);

            sqlComm.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = sqlComm;

            da.Fill(ds);

            dt = ds.Tables[0];
        }


        foreach (DataRow R in dt.Rows)
        {
            Guid ControlID = new Guid();

            RequiredFieldValidator RFV = new RequiredFieldValidator();
            RFV.ID = ControlID.ToString();
            RFV.ControlToValidate = R[0].ToString();
            RFV.ErrorMessage = R[1].ToString();
            RFV.Display = ValidatorDisplay.None;
            RFV.ForeColor = System.Drawing.Color.Red;
            RFV.Enabled = true;
            RFV.Visible = true;

            PlaceHolder PlaceHolder1 = new PlaceHolder();
            PlaceHolder1.Controls.Add(RFV);
        }



        return dt;
    }

//In the pages code-behind.


    protected void Page_Load(object sender, EventArgs e)
    {

            if (!IsPostBack)
            {
                DataTable dtValidators = ObjectSetup.GetPageValidators(3);
            }
 }

2 个答案:

答案 0 :(得分:2)

正如@Sam所述,您应该在Page_Init事件中创建控件。您还需要每次在回发时重新创建动态控件,因此请尝试以下操作:

protected void Page_Init(Object sender, EventArgs e)
{
    DataTable dtValidators = ObjectSetup.GetPageValidators(3);
}

您是否实际上将动态占位符(PlaceHolder1)添加到页面的任何位置?

最后一点,如果您使用new Guid(),您的控件将具有相同的ID,请改用Guid.NewGuid(),或者根本不能设置Control.ID属性。

答案 1 :(得分:1)

如果我是你,我会首先使用CustomValidator,因为在动态添加验证器时会遇到更多问题。

对于CustomValidator,您需要设置以下属性(或者至少在我的情况下我有这些属性):

validator.ControlToValidate = control.ID;
validator.ErrorMessage = errorMessage;
validator.EnableClientScript = true;
validator.Display = ValidatorDisplay.None;

其次,为了将验证器添加到页面树控制树,您需要将它们添加到Page_Init事件,否则不会在ViewState中。