【发布时间】:2014-02-04 20:53:04
【问题描述】:
我正在使用 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 而不是从头开始制作表格,因为我需要它的数据绑定功能来设置各种样式(例如:用红色标记负数)。
【问题讨论】:
-
不使用 ASP.NET WebControls 直接自己渲染表格不是更容易吗?
-
@Dai:我采用了惰性方法并设置了一个带有数据源的 GridView。在当时,手工制作桌子似乎是一项额外的工作。现在我想知道...
-
虽然我不想让您追逐可能对您不起作用的东西,但您尝试做的事情感觉它更自然地适合 ASP.NET MVC 而不是 Webforms。如果需要,您可以在同一个项目中混合使用 MVC 和 Webforms。我相信您还可以找到一些用于使用 MVC (stackoverflow.com/questions/177275/…) 构建网格的组件,这样您就不必从头开始创建它,但我个人不能说它们中的任何一个是否允许您做你想做的事。不过,这可能是方向上的重大变化。
-
只是一个建议,而不是让服务返回 HTML,也许您可以让服务仅以 JSON 格式返回数据,并让页面上的 JavaScript 负责将数据放入隐藏行。
-
@Dr.Wily'sApprentice 我会考虑两个有趣的替代方案。
标签: c# asp.net viewstate webmethod