Parallel.ForEach radiobuttonlist的RenderControl失败

时间:2016-11-21 12:16:29

标签: c# asp.net parallel-processing parallel.foreach rendercontrol

我有一个使用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',有没有人有更好的主意?

0 个答案:

没有答案