将母版页添加到动态创建的UI.Page

时间:2018-07-09 12:19:18

标签: c# asp.net dynamic

我有动态创建的页面

[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还是有其他选择?同样,样式在动态加载后似乎无法正确应用。

0 个答案:

没有答案