findcontrol 不适用于动态生成的 HTMLselect

findcontrol not working for dynamically generated HTMLselect

我在 div divQ1AnswerDDLSub[ 的 innerHTML 中生成 select control(Q1DDL 和 Q2DDL) =31=] 在页面加载中

代码完美如愿生成。

但是,在我按下 SUBMIT 按钮 后,ASP.net 的 findControl 无法从 .aspx 页面中找到生成的 HTMLSELECT 控件(Q1DDL 和 Q2DDL) .

运行时生成HTMLSelect控件

                protected void Page_Load(object sender, EventArgs e)
   {
    if (IsPostBack)
    {
        return;
    }   
....
if (bool.Parse(questions[QNo-1].AnswerDropDownList.visibleDDl))
            {
                (FindControl("lblQ" + QNo + "AnswerDDL") as HtmlGenericControl).InnerText = questions[QNo-1].AnswerDropDownList.titleDDL;
                (FindControl("fsQ" + QNo + "DDL") as HtmlGenericControl).Style["border"] = questions[QNo - 1].AnswerDropDownList.FieldsetDDL == "no" ? "0px" : null;
                var licDDL = questions[QNo-1].AnswerDropDownList.optionDDL;
                var builder = new System.Text.StringBuilder();
                for (int i = 0; i < licDDL.Length; i++)
                    {
                        builder.Append(String.Format("<option value='{0}' title='{1}'  >{1}</option> ", licDDL[i].value, licDDL[i].text));

                    }
                if (questions[QNo-1].AnswerDropDownList.required == "yes")
                    {
                        (FindControl("divQ" + QNo + "AnswerDDLSub") as HtmlGenericControl).InnerHtml = "<select runat=\"server\" name=\"Q" + QNo + "DDL\" id=\"Q" + QNo + "DDL\" required=\"required\">" + builder.ToString() + "</select>";
                    }
                else
                    {
                        (FindControl("divQ" + QNo + "AnswerDDLSub") as HtmlGenericControl).InnerHtml = "<select runat=\"server\" name=\"Q" + QNo + "DDL\" id=\"Q" + QNo + "DDL\">" + builder.ToString() + "</select>";
                    }
             }

查看页面源代码时生成的代码

<div id="divQ1AnswerDDL">
            <fieldset id="fsQ1DDL" style="border:;">
                <legend>
                    <label id="lblQ1AnswerDDL">Title of Drop Down List </label>
                </legend>
                <div id="divQ1AnswerDDLSub"><select runat="server" name="Q1DDL" id="Q1DDL" required="required"><option value='' title='Select'  >Select</option> <option value='IE' title='IE'  >IE</option> <option value='Safari' title='Safari'  >Safari</option> <option value='Chrome' title='Chrome'  >Chrome</option> </select></div>
            </fieldset>
        </div>

在后面的代码中

protected void btnSubmit_Click(object sender, EventArgs e)
{     
....
for (int QNo = 1; QNo < questions.Length + 1; QNo++)
        {
          ADDLRequired = (FindControl("Q" + QNo + "DDL") as     HtmlSelect).Attributes["required"] == "required" ? true: false,


}
}

(FindControl("Q" + QNo + "DDL") as HtmlSelect) <== 显示为空

首先让我们从你渲染这个的错误开始

<select runat="server" name="Q1DDL" id="Q1DDL" required="required"><option

as string inside HTML page,错误在于您期望这将被编译。不,实际上这不是编译 - 编译发生在之前,编译后将呈现为文本 - 并且不会发生更多编译。

所以坚持这个作为第一步...解决这个问题,然后再解决其余的问题。

可能的锻炼

渲染任何你喜欢的 html 正常控制,没有 runat="server",然后在 post 返回后再次渲染它并使用 post 返回 Request.Form["ControlName"] 得到 post 返回值