8

我有一个 ASP.NET 站点,我试图通过它们的 ID 从 C# 代码隐藏文件中访问 div 元素。本质上,我想查看是否存在 div 元素,如果存在,则更改其属性。

我发现许多资源指向十几种不同的解决方案,但它们似乎都不起作用。

ASP.Net 页面上的 HTML:

<div class="contentArea">
     <div class="block" id="button1" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button2" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button3" runat="server">
            Some Content Here
     </div>
</div>

C# 代码背后(我试过的例子):

System.Web.UI.HtmlControls.HtmlGenericControl div1 = (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("button1");
div1.Attributes["class"] = "classNameHere";

或者

Control div1 = this.FindControl("button1");
div1.GetType();

当代码到达上述每个示例的第二行时,我收到一个错误:

你调用的对象是空的。

如果我尝试以下操作:

if (div1 != null)
{
    // Do Something;
}

什么都没有发生,因为 div1 始终设置为 null。具有讽刺意味的是,如果我查看 Locals 窗口并检查它,我可以在列表中看到 button# id,所以我知道它们在那里,但系统的行为就像它没有找到控件一样。

我的最终目标是找到按钮 div 的最大 id #(查看我的 html 示例,最大 id 为 3(button3)。也许有更好的方法来解决它,但无论哪种方式,一旦我有了我的max id,我希望能够触摸每个 div 并更改一些 css 属性。

虽然我可以通过 jQuery 轻松完成所有这些工作,但在这种情况下,我需要在 C# 中完成这些工作。

任何帮助深表感谢。如果您需要更多信息,请告诉我。

更新 我从头开始创建了一个新的 C# web 项目。添加母版页(而不是更改它)并使用母版页添加网络表单后,我只在 Content ID="Content2" 下的网络表单中添加了一行:

<div id="button1"></div>

从后面的 c# 代码中,我仍然遇到与以前相同的问题。

最终更新和答案 我很震惊没有人(包括我自己)从上述更新中发现我的错误。当我在 div 下从头开始创建新项目时,我从来没有放 runat="server" 。以下是我从头开始在新项目下解决问题的方法:

将 runat="server" 添加到 div:

<div id="button1" runat="server"></div>

然后我在 MasterPage 下的 ContentPlaceHolder 上做了一个 FindControl:

ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");

注意:这是默认创建的 Site.Master 页面上 ContentPlaceHolder 代码的样子:

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>

在后面的代码中找到这个 ContentPlaceHolder 后,我在这个占位符中搜索了 button1:

using System.Web.UI.HtmlControls;
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");

最后我检查一下 myControl 是否为空:

if (myControl != null)
{
    \\ Do Something
}

当我运行这段代码时,它找到了我正在寻找的 div。这是所有放在一起的完整代码:

using System.Web.UI.HtmlControls;

ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");

if (myControl != null)
{
    // Do Something
}
4

4 回答 4

11

如果您的页面使用 MasterPage,则 div 控件将不在主控件集合中。该集合仅包含指向 MasterPage 的 ContentPlaceholder 的 Content 控件。

有三个选项:

  1. FindControl在内容控件上使用:contentControl.FindControl("button1");
  2. 进行递归FindControl,直到找到所需的控件
  3. 通常,您的 div 控件的声明会添加到您的 Designer.cs 代码隐藏中,因此您可以通过其名称直接访问该控件:button1.Attributes["class"] = "classNameHere";

更新

我创建了一个 MasterPage,向其中添加了一个内容页面,并添加<div id="button1" runat="server">Some text</div>到了内容页面。

在我的内容页面的代码隐藏中,我添加了以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    var control = FindHtmlControlByIdInControl(this, "button1");

    if (control != null)
    {
        control.Attributes["class"] = "someCssClass";
    }
}

private HtmlControl FindHtmlControlByIdInControl(Control control, string id)
{
    foreach (Control childControl in control.Controls)
    {
        if (childControl.ID != null && childControl.ID.Equals(id, StringComparison.OrdinalIgnoreCase) && childControl is HtmlControl)
        {
            return (HtmlControl)childControl;
        }

        if (childControl.HasControls())
        {
            HtmlControl result = FindHtmlControlByIdInControl(childControl, id);
            if (result != null) return result;
        }
    }

    return null;
}

这对我有用。

于 2012-07-10T16:23:02.320 回答
0

您需要将 runat=server 属性添加到要在后面的代码中访问的任何控件。有关更多帮助,请参阅本文。

从 javascript 和代码隐藏访问 <div>

于 2012-07-10T15:44:01.413 回答
0

我似乎无法重现您的问题,您的 DIV 是否有可能在 UpdatePanel、Repeater 或 Grid 等模板控件中?

于 2012-07-10T15:44:39.547 回答
0

如果添加 runat=server,请在 div 的最后添加:

这将起作用

<div id="divBtn" class="mybuttonCass" runat="server">

然而,这不会

<div runat="server" id="divBtn" class="mybuttonCass">

通过这样做,您可以将代码隐藏中的任何属性修改为:

divBtn.Style["display"] = "none";

这甚至适用于母版页。div 不包含在母版页中。

于 2018-01-23T22:05:39.180 回答