我正在使用Web服务来获取并将GridView呈现为HTML。我们的想法是异步生成它(例如,为可扩展网格生成隐藏行中的数据)。
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static string ExpandRowService(string contextKey)
{
try
{
long recId = long.Parse(contextKey);
return RenderControlToHtml("/Controls/SubGrid.ascx", recId);
}
catch (Exception)
{
return "";
}
}
public static string RenderControlToHtml(string controlPath, params object[] constructorParams)
{
var page = new Page
{
EnableEventValidation = false,
EnableViewState = false,
};
var form = new HtmlForm
{
EnableViewState = false
};
page.Controls.Add(form);
var control = page.LoadControl(controlPath, constructorParams);
form.Controls.Add(control);
return page.RenderControl();
}
问题是渲染到HTML就像需要渲染的虚拟表单一样,而虚拟表单有一个__VIEWSTATE
隐藏输入:
<form method="post" action="ExpandRowService" id="ctl00">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />
</div>
在任何其他操作之后的回发中,有多个__VIEWSTATE
变量,这显然是禁止的。
如何在没有诅咒__VIEWSTATE
隐藏输入的情况下强制将控件呈现为HTML?
编辑:
我正在使用GridView,而不是从头开始制作表格,因为我需要其数据绑定功能来设置各种样式(例如:将红色标记为负数)。
答案 0 :(得分:2)
您可以在不使用周围表单的情况下呈现控件本身。您所需要的只是设置一个由合理存储支持的HtmlTextWriter
实例,例如StringBuilder
:
// create control and make it part of a form and page
…
// render just the control
var c = new StringBuilder();
using (var sw = new StringWriter(c))
{
using (var writer = new HtmlTextWriter(sw))
{
control.RenderControl(writer);
}
}
return c.ToString();
答案 1 :(得分:0)
似乎无法将LoadControl
生成的控件生成为表单(必填),而不生成__VIEWSTATE
。
我制作了自己的TableWriter,并对其进行了一些行绑定。我能做的最好。