我正在尝试将用户控件呈现为字符串。该应用程序设置为允许用户使用令牌,并在找到令牌的位置呈现用户控件。
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中调用的事件均未触发。控制中的中继器需要触发。
答案 0 :(得分: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
参数可以动态地将数据加载到用户控件中,并且可以用于通过数组或类似的东西将多个变量注入控件。
此代码将触发控件中的所有正常事件。
You can read more about it here
此致 Jesper Hauge
答案 1 :(得分:2)
您需要通过将控件添加到页面的控件集合或页面上的控件来将控件附加到页面。除非您在正常的页面呈现事件期间执行明确禁用呈现的操作,否则这不会解决所有问题。
答案 2 :(得分:1)
我采用了上面的Hauge / Scott Guthrie的方法并进行了调整,以便您不需要使用反射,或修改UserControl来实现任何特殊的界面。关键是我添加了一个上面调用RenderView方法的强类型回调,而不是进行反射。
我在博客上写了帮助方法和用法here
HTH, 乔恩