我们正在动态渲染用户控件:
public string RenderControl(string pathcontrol)
{
string html;
var page = new Page();
var control = page.LoadControl(path);
page.Controls.Add(control);
// do stuff to the control (give it some data to work on)
using (var writer = new StringWriter())
{
HttpContext.Current.Server.Execute(page, writer, false);
html = writer.ToString();
}
return html;
}
这使得我们在渲染页面时能够像渲染对ajax调用的响应一样对用户进行控制。但是,当添加本身包含scriptmanagerProxy的控件时,我们遇到的问题是新建的Page对象不包含ScriptManager或需要运行ScriptManager的HtmlForm。
有什么方法吗?
此致 安德烈亚斯
答案 0 :(得分:4)
正如其他人所说,如果您的 Page 对象已完成,您可以轻松地动态添加 ScriptManger [Add ScriptManager to Page Programmatically?。
您可以尝试使用BuildManager.CreateInstanceFromVirtualPath()来创建 Page 对象吗?您可能是如何创建该对象的问题。创建一个新页面比 newing up Page对象要多一些。
例如
Page page
= BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Page))
另请参阅http://www.west-wind.com/weblog/posts/120530.aspx了解更多背景信息。
答案 1 :(得分:1)
你能做这样的事吗:
page.Form.Controls.AddAt(0, New ScriptManager())
编辑:我认为您还需要将控件添加到页面的表单中,而不仅仅是页面本身,对吧?我的理解是表单是用页面创建的,但如果没有,你应该能够做到:
page.Form = new HtmlForm()
您可能还需要执行以下操作:
page.Controls.Add(page.Form)
答案 2 :(得分:0)
当然,诀窍是将其添加到页面的Init事件处理程序中。您可以使用:
Page.Init += delegate {
// check for script manager
if( ScriptManager.GetCurrent(Page) == null ) {
ScriptManager m = new ScriptManager();
m.ScriptMode = ScriptMode.Release;
Page.Form.Controls.AddAt(0, m);
}
}
如果可以的话,我建议您避免动态添加表单到您的页面。例如,上面的代码段假定页面上已经存在表单。
<强>更新强>
当然,谢谢你指出安德烈亚斯。这是一个更新。因此,没有Page.Form的setter - 但你是正确的,你可以添加一个新的HtmlForm到Controls集合。添加后,Page.Form属性不再为null。这将允许您动态添加ScriptManager,如上所示。下面是一个显示此工作的代码示例(ASPX文件是一个简单的页面,没有服务器端表单):
public partial class Pages_Test_DynamicFormSample : Page {
protected void Page_Init(object sender, EventArgs e) {
Controls.Add( new HtmlForm() );
ScriptManager m = new ScriptManager();
m.ScriptMode = ScriptMode.Release;
Form.Controls.AddAt(0, m);
}
protected void Page_Load(object sender, EventArgs e) {
// ScriptManager test
var t1 = new System.Web.UI.WebControls.TextBox();
var t2 = new System.Web.UI.WebControls.TextBox();
Form.Controls.Add( t1 );
Form.Controls.Add( t2 );
ScriptManager.GetCurrent(Page).SetFocus( t2 );
}
}
享受 - 顺便说一句,显然不需要将ScriptManager的ScriptMode设置为Release。我们这样做只是为了避免在ASP.NET脚本运行时的Debug版本中找到一些JavaScript错误。