繁体   English   中英

如何从handeler ashx返回用户控件?

[英]c# asp.net How to return a usercontrol from a handeler ashx?

我想从处理程序中返回控件的HTML输出。 我的代码如下所示:

使用系统; 使用System.IO; 使用System.Web; 使用System.Web.UI; 使用System.Web.UI.WebControls;

公共类PopupCalendar:IHttpHandler {

 public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; System.Web.UI.Page page = new System.Web.UI.Page(); UserControl ctrl = (UserControl)page.LoadControl("~/Controls/CalendarMonthView.ascx"); page.Form.Controls.Add(ctrl); StringWriter stringWriter = new StringWriter(); HtmlTextWriter tw = new HtmlTextWriter(stringWriter); ctrl.RenderControl(tw); context.Response.Write(stringWriter.ToString()); } public bool IsReusable { get { return false; } } 

}

我收到错误消息:

“ / CMS”应用程序中的服务器错误。 你调用的对象是空的。 说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

源错误:

第14行:System.Web.UI.Page页面= new System.Web.UI.Page(); 第15行:UserControl ctrl =(UserControl)page.LoadControl(“〜/ Controls / CalendarMonthView.ascx”); 第16行:page.Form.Controls.Add(ctrl); 第17行:
第18行:StringWriter stringWriter = new StringWriter();

如何通过处理程序返回Usercontrol的输出?

使用BuildManager.GetCompiledType方法加载具有所需内容的现有页面,使用接口实现设置一些公共属性,并调用将其processrequest强制转换为httphander。 这样,您就不会直接公开aspx页面,而可以将来自同一个ashx资源的各种参数留给不同的页面。 保持asp.net页面的优点和功能也很重要。

您可以尝试以下方法:

System.Web.UI.Page page = new System.Web.UI.Page();
UserControl ctrl = (UserControl)page.LoadControl("~/Controls/CalendarMonthView.ascx");
page.Form.Controls.Add(ctrl);

ctrl.DoSomething();

context.Response.CacheControl = "No-Cache";
context.Server.Execute(page, context.Response.Output, true);

您不能仅仅像这样new一个页面类的实例并使其正常工作。 我相当确定您需要通过调用GetCompiledPageInstance来创建它( 基于此处的讨论 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM