我有动态创建的页面
[WebMethod]
public static string Load(string path, string options)
{
try
{
using (Page dynamicPage = new Page())
{
HtmlHead dynamicHead = new HtmlHead();
// dynamicPage.PreInit += new EventHandler(InitPage);
dynamicPage.Controls.Add(dynamicHead);
HtmlForm dynamicForm = new HtmlForm();
dynamicPage.Controls.Add(dynamicForm);
ScriptManager dynamicScript = new ScriptManager();
dynamicForm.Controls.Add(dynamicScript);
UserControl userControl = (UserControl)dynamicPage.LoadControl(dynamicPage.ResolveUrl(path));
//var jss = new JavaScriptSerializer();
// var data = jss.Deserialize<dynamic>(options);
// Dictionary<String, String> dict = (data as object[]).ToDictionary(key => (key as object[])[0].ToString(), val => (val as object[])[1].ToString());
var jOptions = JObject.Parse(options);
// foreach (KeyValuePair<String, String> property in dict)
{
// PropertyInfo prop = userControl.GetType().BaseType.GetProperty(property.Key);
// prop.SetValue(userControl, property.Value, null);
}
var gameId = jOptions["gameId"];
((IPickVsTrend)userControl).Init(long.Parse(gameId.ToString()), new PickCardService(new PickCardRepository()));
((IPickVsTrend)userControl).LoadTab(new FiltersModel { Date = DateTime.Now });
//TextWriter stringWriter = new StringWriter();
//HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
//userControl.RenderControl(htmlWriter);
//string html = stringWriter.ToString();
//return html;
//error - wants to be inside a form tag with runat=server
dynamicForm.Controls.Add(userControl);
using (StringWriter writer = new StringWriter())
{
dynamicPage.Controls.Add(dynamicForm);
HttpContext.Current.Server.Execute(dynamicPage, writer, false);
return writer.ToString();//.Replace("\"", "\\\"");
}
}
}
catch (Exception ex)
{
// Global.log.Error(String.Format("Error: AdminServices.cs: GetUserControl: :{0}:{1}", ex.Message, ex.InnerException));
return ex.Message;
}
}
但是当我尝试附加MasterPageFile属性(甚至在PreInit处理程序上)时,它在CombineVirtualPaths抛出异常,并且对象引用未设置为对象实例,情况可能是什么?这是通过从ajax调用中调用的网络方法创建的。 似乎需要手动指定dynamicPage.AppRelativeVirtualPath,因为它不知道其物理位置,但是现在我遇到了另一个错误:
System.Web.HttpException:“内容控件必须是内容页或引用母版页的嵌套母版页中的顶级控件。”
问题缩小到如何确定在页面中添加新控件的位置,我们应该使用htmlWriter还是有其他选择?同样,样式在动态加载后似乎无法正确应用。