【问题标题】:Findcontrol returning null even tho ID exists即使 ID 存在,Findcontrol 也会返回 null
【发布时间】:2017-03-20 01:23:35
【问题描述】:

我正在处理我的网站并遇到问题。 我正在从母版页将控件动态添加到内容占位符中。 然后,当我想访问项目时,我找不到它们 Findcontrol 方法,但控件在那里,因为我可以看到它们。

母版页:

<body>
<form id="form1" runat="server">

    <header id="master_headline" class="headline">Home Smart Home </header>

    <nav>

        <ul id="nav_hori" runat="server">
            <asp:ContentPlaceHolder ID="master_navigation_hori" runat="server">
            </asp:ContentPlaceHolder>
        </ul>

    </nav>

    <nav>

        <ul id="nav_vert" runat="server">
            <asp:ContentPlaceHolder ID="master_navigation_vert" runat="server">
            </asp:ContentPlaceHolder>
        </ul>

    </nav>


    <div id="master_content_div">
        <asp:ContentPlaceHolder ID="master_content_body" runat="server">
        </asp:ContentPlaceHolder>



    </div>

</form> 

不知何故,正文的结束标签没有显示,但无论如何。

母版页后面的代码:

 protected void Page_Load(object sender, EventArgs e)
    {   
        if (Session["username"] != null)
        {
            master_navigation_hori.Controls.Add(new LiteralControl("   <li><a href='test.aspx'>" + splitted[1] + "</a></li> "));
            //master_navigation_hori.Controls.Add(new LiteralControl("< li class='divider -vertical'></li>"));
            master_navigation_hori.Controls.Add(new LiteralControl("   <li><a href='test.aspx'>" + splitted[2] + "</a></li> "));
            master_navigation_hori.Controls.Add(new LiteralControl("   <li><a href='test.aspx'>" + splitted[3] + " </a></li> "));
            master_navigation_hori.Controls.Add(new LiteralControl("<li class='floatright'><a href='test.aspx'>&#9881</a></li>"));
            master_navigation_hori.Controls.Add(new LiteralControl("<li class='floatright'><a href='test.aspx'>" + Session["username"] + "</a></li>"));
        }
        else
        {
            master_navigation_hori.Controls.Add(new LiteralControl(@"<li class='floatright' id='master_login'>
                <a id='master_login-trigger' href='#'>Log in <span>▼</span> </a>
                <div id='master_login-content' runat='server'>
                <fieldset id='master_inputs'>
                    <input id='master_input_username' runat='server' type='text' name='username' placeholder='Username' value='test' required='required'/>   
                    <input id='master_input_password' runat='server' type='password' name='password' placeholder='Enter your Password'/>
                </fieldset>
                <fieldset id='master_actions'>                        
                    <input type='submit' id='master_sub_login' runat='server' value='Log in' />
                    <label><input type='checkbox' id='master_staylogin' runat='server' checked='checked'/> Keep me signed in</label>
                </fieldset>
                </div>                     
            </li>"));

        }

    }

后面的内容页面代码:

protected void Page_Unload(object sender, EventArgs e)
    {
        if (Page.FindControl("master_login-content") != null)
            MessageBox.Show("page");
       if( Master.FindControl("master_login-content")!=null)
            MessageBox.Show("master");
        if ((Master.FindControl("master_navigation_hori").FindControl("master_login-content"))!=null)
            MessageBox.Show("combi");
        if(FindControl("master_login-content")!=null)
            MessageBox.Show("nichts");

        MessageBox.Show("end");

    }

protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.FindControl("master_login-content") != null)
            MessageBox.Show("page");
       if( Master.FindControl("master_login-content")!=null)
            MessageBox.Show("master");
        if ((Master.FindControl("master_navigation_hori").FindControl("master_login-content"))!=null)
            MessageBox.Show("combi");
        if(FindControl("master_login-content")!=null)
            MessageBox.Show("nichts");

        MessageBox.Show("end");

    }

这在所有地方都返回 null,它只显示“结束”MEssageBox。 它唯一找到的是master_navigation_hori

问候

【问题讨论】:

    标签: c# html css asp.net web


    【解决方案1】:
     protected void Page_Load(object sender, EventArgs e)
        {
           if( (ContentPlaceHolder)Master.FindControl("master_login-content")!=null)
                MessageBox.Show("master");
            if (((ContentPlaceHolder)Master.FindControl("master_navigation_hori").FindControl("master_login-content"))!=null)
                MessageBox.Show("combi");
            MessageBox.Show("end");
    
        }
    

    上面的代码可以帮助你让它工作。如果它工作,请投票。

    【讨论】:

    • 不幸的是它不工作它只是显示结束味精框
    • if( (ContentPlaceHolder)Master.FindControl("master_navigation_hori")!=null) MessageBox.Show("master");试试这个
    • 用你的代码它不会找到 master_navigation_hori 但是当我这样做时 if(Master.FindControl("master_navigation_hori")!=null) MessageBox.Show("own_master");它找到了,但是当我这样做时 if(Master.FindControl("master_navigation_hori").FindControl("master_login-content")!=null) MessageBox.Show("own_master");它什么也没找到
    • 请将
      更改为
      你不能在服务器上运行所以它不能进入​​ if ( (Master.FindControl("master_navigation_hori").FindControl("master_login-content"))!=null)
    • 所以,我现在添加了 runat='server',它仍然无法正常工作,我还更新了上面的代码,我也找不到 master_input_username /password
    【解决方案2】:

    我已经在测试你的代码了。您必须使用System.Web.UI.HtmlControls.HtmlGenericControl 而不是LiteralControl

    所以,我做了这样的改变

    System.Web.UI.HtmlControls.HtmlGenericControl master_login = new System.Web.UI.HtmlControls.HtmlGenericControl("LI");
    master_login.ID = "master_login";
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_login_trigger = new System.Web.UI.HtmlControls.HtmlGenericControl("A");
    master_login_trigger.ID = "master_login-trigger";
    master_login_trigger.Attributes.Add("href", "#");
    master_login_trigger.InnerHtml = "Log in <span>▼</span>";
    
    master_login.Controls.Add(master_login_trigger);
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_login_content = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
    master_login_content.ID = "master_login-content";
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_inputs = new System.Web.UI.HtmlControls.HtmlGenericControl("FIELDSET");
    master_inputs.ID = "master_inputs";
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_input_username = new System.Web.UI.HtmlControls.HtmlGenericControl("INPUT");
    master_input_username.ID = "master_input_username";
    master_input_username.Attributes.Add("type", "text");
    master_input_username.Attributes.Add("name", "username");
    master_input_username.Attributes.Add("placeholder", "Username");
    master_input_username.Attributes.Add("value", "text");
    master_input_username.Attributes.Add("required", "required");
    
    master_inputs.Controls.Add(master_input_username);
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_input_password = new System.Web.UI.HtmlControls.HtmlGenericControl("INPUT");
    master_input_password.ID = "master_input_password";
    master_input_password.Attributes.Add("type", "password");
    master_input_password.Attributes.Add("name", "username");
    master_input_password.Attributes.Add("placeholder", "Enter your Password");
    
    master_inputs.Controls.Add(master_input_password);
    
    master_login_content.Controls.Add(master_inputs);
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_actions = new System.Web.UI.HtmlControls.HtmlGenericControl("FIELDSET");
    master_actions.ID = "master_actions";
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_sub_login = new System.Web.UI.HtmlControls.HtmlGenericControl("INPUT");
    master_sub_login.ID = "master_sub_login";
    master_sub_login.Attributes.Add("type", "submit");
    master_sub_login.Attributes.Add("value", "Log in");
    
    master_actions.Controls.Add(master_sub_login);
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_staylogin_label = new System.Web.UI.HtmlControls.HtmlGenericControl("LABEL");
    master_staylogin_label.ID = "master_staylogin_label";
    master_staylogin_label.InnerText = "Keep me signed in";
    
    System.Web.UI.HtmlControls.HtmlGenericControl master_staylogin = new System.Web.UI.HtmlControls.HtmlGenericControl("INPUT");
    master_staylogin.ID = "master_staylogin";
    master_sub_login.Attributes.Add("type", "checkbox");
    master_sub_login.Attributes.Add("checked", "checked");
    
    master_staylogin_label.Controls.Add(master_sub_login);
    
    master_actions.Controls.Add(master_staylogin_label);
    
    master_login_content.Controls.Add(master_actions);
    
    master_login.Controls.Add(master_login_content);
    
    
    master_navigation_hori.Controls.Add(master_login);
    

    并将这些控件创建移动到Page_Init 而不是Page_Load。因为页面先加载内容页面,然后加载母版页。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签