我有一个使用Parallel.ForEach语句生成HTML的并行循环。在执行的某个地方,我使用RenderControl函数渲染控件的Html。所有控件都渲染得很好(文本框,下拉列表,复选框等),但是radiobuttonlist会出现以下错误:
这是我用来渲染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.NullReferenceException'的例外情况发生在System.Web.dll中但未在用户代码中处理。附加信息:对象引用未设置为对象的实例。
如果我使用普通的foreach循环,则不会出现问题。这是我用来制作radiobuttonlist实例的代码:
var listControl new RadioButtonList();
listControl.ID = "FAC_" + searchFacet.Guid;
listControl.Items.Add(new ListItem("Select an item", "-1"));
我做错了什么?为什么radiobutton与所有其他控件不同? 我在调试期间打了个盹。没有参数似乎为空。
似乎缺少HttpContext是问题所在。我解决了#39;它通过添加一个假的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();
}
这是一个' hack',有没有人有更好的主意?