Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在ASHX处理程序中创建UserControl实例,其中ASCX依赖于父ASPX_Asp.net_User Controls_Ihttphandler - Fatal编程技术网

Asp.net 在ASHX处理程序中创建UserControl实例,其中ASCX依赖于父ASPX

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

我发现这篇关于在.ASHX处理程序中创建ASP.NET UserControls实例的非常有用的文章

不幸的是,我现在有一个需求,我需要创建一个UserControl的实例,该实例依赖于父页面。在这种情况下,我不能使用相同的方法来创建UserControl

有人能建议我怎么做吗?创建父页面的实例,然后获取其包含的UserControl的内容涉及到什么

仅供参考&为了具体说明我正在处理的依赖类型,UserControl是一个面板,存在于一个主要的Factsheet页面上。根据用户的配置首选项,在Factsheet的基类FactsheetBuilderPage中动态生成不同的控件,并包含在页面上

UserControl具有属性,例如:

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之外,还有一些对象是这个用户控件所需要的系统的组成部分。除了创建数据所在的页面之外,还有什么方法是我看不到的呢?我的建议是