收到错误 '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、LinkButton 或您正在使用的任何其他 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);
在渲染控件之前
我收到上述错误消息。但是,有问题的页面确实有一个带有 运行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、LinkButton 或您正在使用的任何其他 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);
在渲染控件之前