【问题标题】:how can we load usercontrol using generic handler?我们如何使用通用处理程序加载用户控件?
【发布时间】:2011-03-31 12:21:16
【问题描述】:

我想使用 jquery ajax 加载用户控件。我发现的一种可能是通过通用处理程序加载用户控件。任何人都可以帮助我。这里是我用来调用控件的 ajax 代码。

 <script type="text/javascript">
 function fillSigns() { 
                $.ajax({
                    url: "usercontrolhandler.ashx?control=signs.ascx",
                    context: document.body,
                    success: function (data) {                       
                        $('#signdiv').html(data);
                    }
                });
            }  
 </script>

这是处理程序文件中的代码

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        Page page = new Page();
        UserControl ctrl = (UserControl)page.LoadControl("~/" + context.Request["control"] + ".ascx");      
        page.Form.Controls.Add(ctrl);

        StringWriter stringWriter = new StringWriter();
        HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
        ctrl.RenderControl(tw);
        context.Response.Write(stringWriter.ToString());
    } 

此代码在下面显示的行中引发未找到对象引用错误。

 page.Form.Controls.Add(ctrl);

【问题讨论】:

  • 无需创建Page 对象来渲染UserControl。删除该代码,您会没事的。

标签: asp.net ajax generics user-controls handler


【解决方案1】:

这里似乎page.Formnull,这就是为什么你有一个空引用异常。您可以将您的用户控件添加到页面的控件集合中:

page.Controls.Add(ctrl);

您也可以使用HttpServerUtility.Execute 方法进行页面渲染:

StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(page, output, false);

最后看看 Scott Guthrie 的 Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios 文章,它涵盖了您的问题。

【讨论】:

    【解决方案2】:

    试试这个:

    Page page = new Page {ViewStateMode = ViewStateMode.Disabled};
    HtmlForm form = new HtmlForm { ViewStateMode = ViewStateMode.Disabled };
    form.Controls.Add(ctrl);
    page.Controls.Add(form);
    

    然后:

    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
    page.RenderControl(tw);
    context.Response.Write(stringWriter.ToString());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多