【问题标题】:Cannot get inner HTML when trying to show div element尝试显示 div 元素时无法获取内部 HTML
【发布时间】:2021-11-05 05:13:35
【问题描述】:

我正在支持一个非常古老的遗留应用程序,该应用程序即将被删除,它是用 aspx 编写的。我在页面 (Example.aspx) 中有一个 <div> 元素,我试图根据复选框选中的值在后面的代码 (Example.aspx.cs) 中使其可见。但是我不断收到这个Cannot get inner content of '' because the contents are not literal 错误,因此我的 div 没有被渲染。我提到了这篇 SO 帖子:Cannot get inner content of '' because the contents are not literal,其中提到这不适用于在服务器上运行的控件,即runat="server"。我无法访问建议的这篇 SO 帖子的一个答案中引用的 Wordpress 网址:Cannot get inner HTML - 而这个 (Cannot manage to change the inner html of a div element) 不适用于我的问题。

例子.aspx:

<div id="testID" runat="server"> <!--some content ---></div>

Example.aspx.cs:

 protected void checkBoxName_CheckedChanged(object sender, EventArgs e)
 {
      if(!checkBoxName.Checked)
           testID.Visible = true; //The exception is thrown here
 }

【问题讨论】:

  • 请在出现Cannot get inner content of '' because the contents are not literal错误的地方添加代码。
  • @SelimYildiz 抛出异常这一行testID.Visible = true;。我用评论编辑了问题

标签: c# asp.net


【解决方案1】:

您尚未显示 CheckBox 的代码,但考虑到您有一个事件处理程序,我假设您有类似以下内容:

<asp:CheckBox id="checkBoxName" runat="server" OnCheckedChanged="checkBoxName_CheckedChanged" AutoPostBack="true" Checked="true" /> This is my CheckBox
<div class='myClass1' id="testID" runat="server">This is my DIV</div>

在这种情况下,以下应该起作用:

protected void checkBoxName_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cBox = (CheckBox)sender;
    Control divCtrl = cBox.Parent.FindControl("testID");

    if (divCtrl != null)
    {
        //set value
        divCtrl.Visible = cBox.Checked;
    }
}

这已使用以下方法进行了测试:

创建一个新项目 - ASP .NET Web Application (.NET Framework)

  • 对于项目名称:CheckBoxTest
  • 点击创建
  • 点击清空
  • 取消选中为 HTTPS 配置(可选)
  • 点击创建

打开解决方案资源管理器

  • 在VS菜单中,点击查看
  • 选择解决方案资源管理器

添加网络表单

  • 在解决方案资源管理器中,右键单击
  • 点击添加
  • 选择新项目
  • 点击Web表单(名称:default.aspx)
  • 点击添加

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="CheckBoxTest._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:CheckBox id="checkBoxName" runat="server" OnCheckedChanged="checkBoxName_CheckedChanged" AutoPostBack="true" Checked="true" /> This is my CheckBox
        <p />
        <div class='myClass1' id="testID" runat="server">This is my DIV</div>
    </form>
</body>
</html>

default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CheckBoxTest
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void checkBoxName_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cBox = (CheckBox)sender;

            //find desired control
            Control divCtrl = cBox.Parent.FindControl("testID");

            if (divCtrl != null)
            {
                //set value
                divCtrl.Visible = cBox.Checked;
            }
        }
    }
}

资源

其他资源

【讨论】:

  • 可惜我不能附上截图,但我有你的代码完全一样,我仍然得到同样的错误......
  • 以下内容可能会有所帮助:stackoverflow.com/questions/4955769/…
  • 该页面有更新面板。它可以解释为什么这件事不起作用
【解决方案2】:

好的,这看起来尽可能简单。

但是,请记住,当您将控件设置为 visible = false 时,不会发生 HTML 呈现。

换句话说,您设置了 visible = false,然后其他代码(在大多数情况下是客户端)将看不到这个“div”或其他任何东西 - 因为它根本没有呈现。

我不知道这里涉及哪些其他代码,但我会测试/尝试/考虑使用样式隐藏,因此 HTML 仍然存在 - 但不显示。

那么,试试这个:

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

然后显示,然后

 testID.Style["display"] = "normal";

但是,这里可能涉及一些 udpate 面板 - 这将改变其工作方式。如果按钮/复选框在更新面板内,而 div 不是?那么这将不起作用。

但是,如果按钮/复选框位于更新面板之外,那么它应该可以正常工作。因此,如果正在使用更新面板,这可能会影响行为。

【讨论】:

  • 页面上有一些更新面板,但实际的 div 本身并没有嵌套在更新面板中
  • 好吧,更新面板内的复选框会导致这种情况。因此,虽然 div 可能在更新面板中,而复选框在外面?这将起作用反过来是行不通的!因此,如果复选框在更新面板内,而 div 在里面 - 没问题。面板内部的复选框和外部的 div - 不行。
  • 此外,即使您使用母版 + 子页面,我们再次假设代码和标记位于子页面中 - 我们不在乎 + 担心母版页。
猜你喜欢
  • 2021-03-17
  • 2012-08-18
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多