0

我有一个使用 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();
}

这是一个“黑客”,有人有更好的主意吗?

4

0 回答 0