在没有__VIEWSTATE的情况下将控件呈现为HTML

时间:2014-02-04 20:53:04

标签: c# asp.net viewstate webmethod

我正在使用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,而不是从头开始制作表格,因为我需要其数据绑定功能来设置各种样式(例如:将红色标记为负数)。

2 个答案:

答案 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,并对其进行了一些行绑定。我能做的最好。