6

我正在尝试将用户控件呈现为字符串。应用程序设置为使用户能够使用令牌,并且在找到令牌的地方呈现用户控件。

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);

Control uc = LoadControl("~/includes/HomepageNews.ascx");
uc.RenderControl(writer);
return sb.ToString();

该代码呈现控件,但控件的 Page_Load 中调用的任何事件都未触发。控件中有一个中继器需要触发。

4

3 回答 3

13

很长一段时间以来,我一直在使用 Scott Guthrie 在他的博客中提供的以下代码:

public class ViewManager
{
    public static string RenderView(string path, object data)
    {
        Page pageHolder = new Page();
        UserControl viewControl = (UserControl) pageHolder.LoadControl(path);

        if (data != null)
        {
            Type viewControlType = viewControl.GetType();
            FieldInfo field = viewControlType.GetField("Data");
            if (field != null)
            {
                field.SetValue(viewControl, data);
            }
            else
            {
                throw new Exception("ViewFile: " + path + "has no data property");
            }
        }

        pageHolder.Controls.Add(viewControl);
        StringWriter result = new StringWriter();
        HttpContext.Current.Server.Execute(pageHolder, result, false);
        return result.ToString();
    }
}

object data参数可以将数据动态加载到用户控件中,并且可以用于通过数组或类似的方式将多个变量注入到控件中。

此代码将触发控件中的所有正常事件。

你可以在这里读更多关于它的内容

问候杰斯珀豪格

于 2008-11-03T20:15:35.463 回答
2

您需要通过将控件添加到页面的控件集合或页面上的控件来将控件附加到页面。除非您在正常页面渲染事件期间明确禁用渲染,否则这不会解决您的所有问题。

于 2008-11-03T14:55:20.463 回答
1

我采用了 Hauge/Scott Guthrie 的上述方法并对其进行了调整,以便您无需使用反射,或修改 UserControl 来实现任何特殊接口。关键是我添加了上面 RenderView 方法调用的强类型回调,而不是进行反射。

我在这里写了帮助方法和用法

HTH,乔恩

于 2009-10-29T13:11:19.263 回答