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 ステートメントは、null 参照例外をスローします。
タイプ '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"));
私は何を間違っていますか?ラジオボタンが他のすべてのコントロールと異なるのはなぜですか? デバッグ中にチェックしました。null のパラメータはないようです。
欠落している 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();
}
それは「ハック」です、誰かがより良い考えを持っていますか?