Asp.net 在ASHX处理程序中创建UserControl实例,其中ASCX依赖于父ASPX
我发现这篇关于在.ASHX处理程序中创建ASP.NET UserControls实例的非常有用的文章 不幸的是,我现在有一个需求,我需要创建一个UserControl的实例,该实例依赖于父页面。在这种情况下,我不能使用相同的方法来创建UserControl 有人能建议我怎么做吗?创建父页面的实例,然后获取其包含的UserControl的内容涉及到什么 仅供参考&为了具体说明我正在处理的依赖类型,UserControl是一个面板,存在于一个主要的Factsheet页面上。根据用户的配置首选项,在Factsheet的基类FactsheetBuilderPage中动态生成不同的控件,并包含在页面上 UserControl具有属性,例如:Asp.net 在ASHX处理程序中创建UserControl实例,其中ASCX依赖于父ASPX,asp.net,user-controls,ihttphandler,Asp.net,User Controls,Ihttphandler,我发现这篇关于在.ASHX处理程序中创建ASP.NET UserControls实例的非常有用的文章 不幸的是,我现在有一个需求,我需要创建一个UserControl的实例,该实例依赖于父页面。在这种情况下,我不能使用相同的方法来创建UserControl 有人能建议我怎么做吗?创建父页面的实例,然后获取其包含的UserControl的内容涉及到什么 仅供参考&为了具体说明我正在处理的依赖类型,UserControl是一个面板,存在于一个主要的Factsheet页面上。根据用户的配置首选项,在F
public DateTime EffectiveDate
{
get
{
return ((FactsheetBuilderPage)this.Page).EffectiveDate;
}
}
public Site ConfiguredSite
{
get { return ((FactsheetBuilderPage)this.Page).SiteConfiguration; }
}
public ConfiguredFund Fund
{
get
{
return ((FactsheetBuilderPage)this.Page).Fund;
}
}
它引用FactsheetBuilderPage类,这意味着我需要创建一个FactsheetBuilderPage类供其引用
理想情况下,我能够解决这个问题,而不必修改现有的代码库,因为重构这将是一个真正的痛苦
谢谢各位
Dave您可以通过几种方法创建和执行页面。一种是使用BuildManager类实例化页面,如下所示: Page Page=BuildManager.CreateInstanceFromVirtualPath(“/my/app/Page.aspx”,typeof(MyPageClass))作为页面 但是,如果需要在当前请求上下文中执行页面,请尝试以下方法:
Page page = new MyPageClass();
page.AppRelativeVirtualPath =
context.Request.AppRelativeCurrentExecutionFilePath;
page.ProcessRequest(context);
当然是这样。您可以通过两种方法创建和执行页面。一种是使用BuildManager类实例化页面,如下所示: Page Page=BuildManager.CreateInstanceFromVirtualPath(“/my/app/Page.aspx”,typeof(MyPageClass))作为页面 但是,如果需要在当前请求上下文中执行页面,请尝试以下方法:
Page page = new MyPageClass();
page.AppRelativeVirtualPath =
context.Request.AppRelativeCurrentExecutionFilePath;
page.ProcessRequest(context);
这当然是。恐怕是你走进了这间。如果您要创建一个依赖于其页面的用户控件,那么为什么它是独立的呢?用户控件用于创建模块化。它们不应该依赖于页面
也就是说,依赖性是什么?既然你显然不想要这一页,那么也许你可以在没有这一页的情况下提供你所需要的。恐怕你走进了这一页。如果您要创建一个依赖于其页面的用户控件,那么为什么它是独立的呢?用户控件用于创建模块化。它们不应该依赖于页面
也就是说,依赖性是什么?既然您显然不想要该页面,那么也许您可以在没有该页面的情况下提供所需的内容。好的,所以解决方案是将UserControl的属性更改为自动,而不仅仅是使用引用父页面的getter
public ConfiguredFund Fund { get; set; }
public DateTime EffectiveDate { get; set; }
public Site ConfiguredSite { get; set; }
现在,这意味着在实例化用户控件时,我必须明确地为这些属性赋值。这允许我在任何地方创建此UserControl的实例,而不需要父页面,只要我可以提供它所需的数据
然后在我的处理程序中,创建UserControl的实例并分配它所需的属性:
private MyUserControl GetUserControl(int id)
{
MyUserControl myUc = GetUserControl("Controls/MyUserControl.ascx");
myUc.Fund = new ConfiguredFund(id);
myUc.EffectiveDate = DateTime.Now;
myUc.ConfiguredSite = siteManager.GetSiteById(2);
return myUc;
}
然后,为了获得呈现的html,我使用了Scott Guthrie代码的稍微修改版本:
public static string RenderView(MyUserControl viewControl, object data)
{
Page pageHolder = new Page();
if (data != null)
{
Type viewControlType = viewControl.GetType();
FieldInfo field = viewControlType.GetField("Data");
if (field != null)
{
field.SetValue(viewControl, data);
}
else
{
throw new Exception("View file doesn't have a public Data property");
}
}
pageHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
谢谢各位
Dave好的,所以解决方案是将UserControl的属性更改为自动,而不仅仅是有一个引用父页面的getter
public ConfiguredFund Fund { get; set; }
public DateTime EffectiveDate { get; set; }
public Site ConfiguredSite { get; set; }
现在,这意味着在实例化用户控件时,我必须明确地为这些属性赋值。这允许我在任何地方创建此UserControl的实例,而不需要父页面,只要我可以提供它所需的数据
然后在我的处理程序中,创建UserControl的实例并分配它所需的属性:
private MyUserControl GetUserControl(int id)
{
MyUserControl myUc = GetUserControl("Controls/MyUserControl.ascx");
myUc.Fund = new ConfiguredFund(id);
myUc.EffectiveDate = DateTime.Now;
myUc.ConfiguredSite = siteManager.GetSiteById(2);
return myUc;
}
然后,为了获得呈现的html,我使用了Scott Guthrie代码的稍微修改版本:
public static string RenderView(MyUserControl viewControl, object data)
{
Page pageHolder = new Page();
if (data != null)
{
Type viewControlType = viewControl.GetType();
FieldInfo field = viewControlType.GetField("Data");
if (field != null)
{
field.SetValue(viewControl, data);
}
else
{
throw new Exception("View file doesn't have a public Data property");
}
}
pageHolder.Controls.Add(viewControl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
谢谢各位
戴夫加布里埃尔,我完全同意你的看法,只是我没有进去,只是顺便去了一下。我推动在MVC中正确完成这个项目。如果是的话,一切都是独立的。不幸的是,我还没来得及对架构进行任何输入就陷入了这一切的中间。。现在,我有另一个MVC应用程序需要这个面板。这就是为什么我在classic.net中有一个处理程序作为服务工作。@Dave:对页面的依赖性是什么?我认为(如果不是为了消除依赖性)最好的办法是看看我们是否可以在不创建页面的情况下实现依赖性。我再次更新了示例。-除了EffectiveDate之外,还有一些对象是这个用户控件所需要的系统的组成部分。除了必须创建数据所在的页面之外,还有没有一种访问这些数据的方法?我的建议是删除页面上的依赖关系。从长远来看,如果你修复设计糟糕的代码,而不是试图去解决它,那会更好。加布里埃尔,我完全同意你的看法,只是我没有参与进来,我被顺便去了。我推动在MVC中正确完成这个项目。如果是的话,一切都是独立的。不幸的是,我还没来得及对架构进行任何输入就陷入了这一切的中间。。现在,我有另一个MVC应用程序需要这个面板。这就是为什么我在classic.net中有一个处理程序作为服务工作。@Dave:对页面的依赖性是什么?我认为(如果不是为了消除依赖性)最好的办法是看看我们是否可以在不创建页面的情况下实现依赖性。我再次更新了示例。-除了EffectiveDate之外,还有一些对象是这个用户控件所需要的系统的组成部分。除了创建数据所在的页面之外,还有什么方法是我看不到的呢?我的建议是