Pergunta

Eu encontrei este artigo extremamente útil na criação de instâncias de UserControls ASP.NET no .ashx manipuladores por Scott Guthrie .

Infelizmente eu tenho agora uma exigência agora onde eu preciso para criar uma instância de um UserControl que tem uma dependência na página pai. Sendo este o caso, eu não posso usar o mesmo método para criar o UserControl.

Alguém pode sugerir como eu poderia fazer isso? O que está envolvido na criação de uma instância da página pai e, em seguida, recebendo o conteúdo do UserControl ele contém?

Apenas para referência e para ser mais específico sobre o tipo de depenendency estou lidando, o UserControl é um painel que existe em uma página principal Factsheet. Dependendo das preferências de configuração do usuário, diferentes controles são gerados dinamicamente em FactsheetBuilderPage classe base do Factsheet, e incluídos na página.

O UserControl tem propriedades, como:

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;
    }
}

que faz referência a classe FactsheetBuilderPage, o que significa que eu preciso para criar uma classe FactsheetBuilderPage por ele para referência.

Idealmente, eu seria capaz de resolver esse problema sem ter que modificar a base de código existente, porque refactoring isso vai ser uma verdadeira dor !!

Obrigado rapazes

Dave

Foi útil?

Solução 2

Ok, então a solução acabou por ser alterar as propriedades do UserControl para ser automático, em vez de apenas ter um getter que referrs para a página pai.

public ConfiguredFund Fund { get; set; }

public DateTime EffectiveDate { get; set; }

public Site ConfiguredSite { get; set; }

Agora, isso significa que eu tenho valores para explicitamente atribuir a essas propriedades quando o controle usuário está sendo instanciado. Isso me permite criar uma instância desse lugar UserControl sem a necessidade da página pai, contanto que eu possa fornecer seus dados necessários.

, em seguida, na minha Handler, criar uma instância do UserControl e atribuir as propriedades de que necessita:

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;
}

, em seguida, para obter o HTML processado, eu uso uma versão ligeiramente modificada do código de 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();
}

Obrigado pessoal

Dave

Outras dicas

Você entrou em um presente, eu tenho medo. Se você estiver indo para fazer um controle de usuário que depende da sua página, então por que é separar? Um controlo de utilizador é utilizado para criar a modularidade. Eles não devem ser dependentes na página.

Dito isto, o que é a dependência? Desde que você, obviamente, não quer que a página, então talvez você pode fornecer o que é necessário sem a página.

Você pode criar e executar uma página por um par de métodos. Uma é usar a classe BuildManager para instanciar uma página, assim:

Página page = BuildManager.CreateInstanceFromVirtualPath ( "/ minha / app / Page.aspx", typeof (MyPageClass)) como página;

Mas se você precisar de sua página para executar no contexto atual solicitação, experimentá-lo desta maneira:

Page page = new MyPageClass();  
page.AppRelativeVirtualPath = 
         context.Request.AppRelativeCurrentExecutionFilePath; 
page.ProcessRequest(context);

Este é, naturalmente cortesia de Rick Strahl .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top