我有一个使用 Parallel.ForEach 语句生成 HTML 的并行循环。在执行的某处,我使用 RenderControl 函数渲染控件的 Html。所有控件都呈现良好(文本框、下拉列表、复选框等),但单选按钮列表会出现以下错误:
这是我用来呈现 HTML 的函数
public static string ControlToString(Control control)
{
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var hw = new Html32TextWriter(sw);
control.RenderControl(hw);
return sb.ToString();
}
RenderControl 语句抛出空引用异常:
System.Web.dll 中出现“System.NullReferenceException”类型的异常,但未在用户代码中处理。其他信息:对象引用未设置为对象的实例。
如果我使用正常的 foreach 循环,则不会出现问题。这是我用来制作单选按钮列表实例的代码:
var listControl new RadioButtonList();
listControl.ID = "FAC_" + searchFacet.Guid;
listControl.Items.Add(new ListItem("Select an item", "-1"));
我究竟做错了什么?为什么单选按钮与所有其他控件不同?我在调试期间进行了检查。没有参数似乎为空。
似乎缺少 HttpContext 是问题所在。我通过添加一个假的 HttpContext 来“解决”它:
public static string ControlToString(Control control)
{
if (HttpContext.Current == null)
{
HttpContext.Current = new HttpContext(new HttpRequest(string.Empty, "http://localhost:81/default.aspx", string.Empty), new HttpResponse(null));
}
var sb = new StringBuilder();
var sw = new StringWriter(sb);
var hw = new Html32TextWriter(sw);
control.RenderControl(hw);
return sb.ToString();
}
这是一个“黑客”,有人有更好的主意吗?