Parallel.ForEach RenderControl из радиобуттонлиста не работает

У меня есть параллельный цикл генерации HTML с помощью оператора Parallel.ForEach. Где-то в выполнении я рендерил HTML-элементы управления с помощью функции RenderControl. Все элементы управления отображаются хорошо (текстовые поля, выпадающие списки, флажки и т. Д.), Но список радиобуттон дает следующую ошибку:

Это функция, которую я использую для отображения 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"));

Что я делаю неправильно? Почему радиопереключатель отличается от всех других элементов управления? Я проверял во время отладки. Никакие параметры не кажутся нулевыми.

Похоже, отсутствующий 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();
}

Это "хак", у кого-нибудь есть идея получше?

0 ответов

Другие вопросы по тегам