【问题标题】:ASP.NET html element tr lostASP.NET html 元素 tr 丢失
【发布时间】:2021-08-20 10:08:48
【问题描述】:

我制作了根据数据计数生成表格行和列的脚本。然后我制作了脚本:

System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("");

            sb.Append("var row = document.createElement('TR');");
            sb.Append("var a = '");

            for (int i = 0; i < dataVar.Count; i++)
            {
                Counter = i;

                int fileNo = Convert.ToInt32(dataVar[i].Replace("picUrl", ""));
                string filename = Request.Params["picUrl" + fileNo];

                sb.Append("<tr>" +
                        "<td>" +
                            "<img src=\"" + ResolveUrl(filename) + "\" width=\"100px\" height=\"100px\" />" +
                            "<input type=\"text\" name=\"picUrl" + Counter + "\" id=\"gbr" + Counter + "\" value=\"" + filename + "\" class=\"d-none\" /></td>" +
                        "<td>" +
                            "<select name=\"resType" + Counter + "\" id=\"resType" + Counter + "\" class=\"form-control form-control-sm\">" +
                            "<option value=\"\">Parkir</option>" +
                            "<option value=\"0\">Other</option>" +
                            "<option value=\"1\">Bensin</option>" +
                            "<option value=\"2\">E-toll</option>" +
                            "<option value=\"3\">Parkir</option>" +
                            "</select>" +
                        "</td>" +
                        "<td><input type=\"text\" name=\"amount" + Counter + "\" id=\"txtInput" + Counter + "\" class=\"form-control form-control-sm\" /></td>" +
                        "<td><input id=\"Button" + Counter + "\" name=\"button" + Counter + "\" type=\"button\" value=\"Remove\" onclick = \"RemoveFileUpload(this)\" /></td>" +
                    "</tr>");
            }
            sb.Append("';");

            sb.Append("row.innerHTML = a; var s = document.getElementById(\"AddRow\"); s.appendChild(a); counter++; ");

            ClientScript.RegisterStartupScript(this.GetType(), "addRow", sb.ToString(), true);

当我在浏览器上显示它时,一些 html 元素关闭标记消失(&lt;img /&gt; become &lt;img&gt;&lt;input /&gt; become &lt;input&gt;&lt;/tr&gt; 标记消失,除了最后一个等)。是错误还是有人可以帮助我吗?

【问题讨论】:

  • 尽可能放回您的原始代码。您当前的代码现在没有意义,它不完整。
  • 你能测试“sb.ToString()”的值吗?如果你能把它放在问题中。或者测试是否正确的html。
  • @शेखर:我做过并测试过。 sb.ToString() 适用于标准 HTML。
  • 首先,尝试注册部分JS代码而不附加stringbuilder(一行带有示例数据)-您将测试JS的整个注册是否导致将JS包含在您的HTML中并且它是正确的。比,如果可行,则从附加的字符串构建器末尾发布生成的字符串,因为它可能是损坏的代码,正如您所说的那样,某些东西消失了...
  • 我认为问题可能是因为 createElement 正在创建一个 TR 标签,然后它的内部 HTML 被设置为多行。不确定是什么解决方案,但它可能适用于 row = document.createElement();

标签: c# html asp.net


【解决方案1】:

当您更新您的问题时,我正在处理它,所以下面的代码来自您的原始问题。

我认为这与结尾附近的行有关:row.innerHTML = a;。在那里,您将所有新行附加到另一行,而您不必这样做。只需附加您的变量a

可能还有别的东西,我必须尽可能多看。

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("var a = '");

for (int i = 0; i < dataVar.Count; i++)
{
    int fileNo = Convert.ToInt32(dataVar[i].Replace("picUrl", ""));
    string filename = Request.Params["picUrl" + fileNo];

    sb.Append("<tr>" +
        "<td>" +
            "<img src=\"" + ResolveUrl(filename) + "\" width=\"100px\" height=\"100px\" />" +
            "<input type=\"text\" name=\"picUrl" + i + "\" id=\"gbr" + i + "\" value=\"" + filename + "\" class=\"d-none\" /></td>" +
        "<td>" +
            "<select name=\"resType" + i + "\" id=\"resType" + i + "\" class=\"form-control form-control-sm\">" +
            "<option value=\"\">Parkir</option>" +
            "<option value=\"0\">Other</option>" +
            "<option value=\"1\">Bensin</option>" +
            "<option value=\"2\">E-toll</option>" +
            "<option value=\"3\">Parkir</option>" +
            "</select>" +
        "</td>" +
        "<td><input type=\"text\" name=\"amount" + i + "\" id=\"txtInput" + i + "\" class=\"form-control form-control-sm\" /></td>" +
        "<td><input id=\"Button" + i + "\" name=\"button" + i + "\" type=\"button\" value=\"Remove\" onclick = \"RemoveFileUpload(this)\" /></td>" +
    "</tr>");
}

sb.Append("';");

// make sure `s` is the table or tbody. 
sb.Append("var s = document.getElementById(\"AddRow\"); s.insertAdjacentHTML('beforeend', a);");

ClientScript.RegisterStartupScript(this.GetType(), "addRow", sb.ToString(), true);

【讨论】:

  • 我试过你的建议,表格中没有出现任何行。
  • AppendChild 不适用于字符串,它需要一个“节点”类型的参数。相反可以尝试 s.insertAdjacentHTML('afterbegin', a);
  • 是的,s.insertAdjacentHTML('beforeend', a); 就是其中之一。 确保s 是`table` 或tbody(如果存在)。您不需要前两行“附加”行,以 sb.Append(""); 开头。
  • 您可能想要查看的另一件事是document.createDocumentFragment();。我以与您正在做的类似的方式使用它,但这里可能不需要它。
  • 您可以做的另一件事是删除Counter。它只是重复了i,所以使用i。我已经更新了。
猜你喜欢
  • 2016-05-30
  • 2011-10-02
  • 2020-05-22
  • 2011-11-18
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多