收到错误 'must be placed inside a form tag with runat=server',但它是

getting error 'must be placed inside a form tag with runat=server', but it is

我收到上述错误消息。但是,有问题的页面确实有一个带有 运行at="server" 属性的标签(在设计时)并且控件在其中。如果我 运行 项目并查看源代码,则该属性似乎消失了(不确定该部分是否正常,或者如果不正常是什么原因造成的)。

当我尝试 运行 RenderControl 方法时出现错误。该页面一开始就加载得很好。有什么想法吗?

<form id="form1" runat="server">
<div id="hiddenMVR" runat="server" style="display:block;">
 // lots of other controls in here removed for brevity
</div>
</form>

后面的代码:

            StringBuilder stringBuilder = new StringBuilder();
            StringWriter stringWriter = new StringWriter(stringBuilder);
            HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
            //error occurs on RenderControl
            this.hiddenMVR.RenderControl(htmlTextWriter);

显然下面的代码解决了这个问题,但老实说我不确定为什么,因为原始错误消息不准确:

public override void VerifyRenderingInServerForm(Control control) 
{ 
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server 
    control at run time. Used to avoid issue using RenderControl above */ 
}

显然,这覆盖了一些我不知道的内置方法,该方法正在执行导致错误的操作。在没有代码的情况下覆盖它可以防止默认情况下发生的任何事情,从而消除错误。

这个 "fix" 在其他一些帖子中提到过,但我认为它不适用,因为错误消息与代码不符。

我没有注意到这样做有任何不利的问题。

在 RenderControl 之前,您需要将 Button、LinkBut​​ton 或您正在使用的任何其他 asp.net 组件的类型更改为 Literal。 最简单的方法是删除该控件并在该位置添加 Literal。 执行相同操作的示例代码如下。

private void DisableControls(Control gv)
{
    Literal l = new Literal();

    for (int i = 0; i < gv.Controls.Count; i++)
    {
        if (gv.Controls[i].GetType() == typeof(Button))

        {
            l.Text = (gv.Controls[i] as Button).Text;
            gv.Controls.Remove(gv.Controls[i]);
            gv.Controls.AddAt(i, l);
        }

        if (gv.Controls[i].GetType() == typeof(LinkButton))
        {
            l.Text = (gv.Controls[i] as LinkButton).Text;
            gv.Controls.Remove(gv.Controls[i]);
            gv.Controls.AddAt(i, l);
        }

        if (gv.Controls[i].GetType() == typeof(CheckBox))
        {
            l.Text = (gv.Controls[i] as CheckBox).Text;
            gv.Controls.Remove(gv.Controls[i]);
            gv.Controls.AddAt(i, l);
        }

        if (gv.Controls[i].HasControls())
        {
            DisableControls(gv.Controls[i]);
        }
    }
}

您可以使用

调用相同的内容
DisableControls(listView);

在渲染控件之前