Domanda

I caricare il contenuto di alcuni controlli utente nella mia pagina con l'utilizzo di jQuery. Quindi ho questa funzione che estrae il contenuto del mio controllo utente, e funziona come un fascino.

    public string GetObjectHtml(string pathToControl)
    {
        // Create instance of the page control
        Page page = new Page();

        // Create instance of the user control
        UserControl userControl = (UserControl)page.LoadControl(pathToControl);

        //Disabled ViewState- If required
        userControl.EnableViewState = false;

        //Form control is mandatory on page control to process User Controls
        HtmlForm form = new HtmlForm();

        //Add user control to the form
        form.Controls.Add(userControl);

        //Add form to the page
        page.Controls.Add(form);

        //Write the control Html to text writer
        StringWriter textWriter = new StringWriter();

        //execute page on server
        HttpContext.Current.Server.Execute(page, textWriter, false);

        // Clean up code and return html
        string html = CleanHtml(textWriter.ToString());

        return html;
    }

Ma mi piacerebbe davvero di inviare alcuni parametri nel mio controllo utente quando creo esso. Questo è possibile, e come posso farlo?

vedo che LoadControl() può prendere alcuni parametri con object[] parameters ma im veramente non è sicuro su come usarlo, aiuto molto apprezzato!

È stato utile?

Soluzione

È possibile implementare un'interfaccia sul tuo UserControl per i params appropriate.

public interface ICustomParams
{
    string UserName { get; set; }
    DateTime SelectedDate { get; set; }
}

implementa l'interfaccia nella UserControl, come questo

public partial class WebUserControl : System.Web.UI.UserControl , ICustomParams
{
    public string UserName { get; set; }
    public DateTime SelectedDate  { get; set; }
}

quindi caricare il vostro controllo:

  UserControl userControl = (UserControl)page.LoadControl(pathToControl);

Acces il controllo tramite l'interfaccia

  ICustomParams ucontrol = userControl as ICustomParams;
  if(ucontrol!=null)
  {
       ucontrol.UserName = "henry";
       ucontrol.SelectedDate = DateTime.Now;
  }

Fatto,

è possibile aggiungere più interfacce per molteplici scopi lì. Se l'UserControl ha implementato non l'interfaccia, l'istruzione if sarà evitare di utilizzarlo

Ma se davvero non si può accedere ai controlli utente e si sa "un po '" delle proprietà che si desidera impostare e che tipo sono provare un modo più dinamico con la riflessione:

caricare l'UserControl:

    UserControl userControl = (UserControl)Page.LoadControl(@"~/WebUserControl.ascx");

ottenere le proprietà di UserControl caricato:

    PropertyInfo[] info = userControl.GetType().GetProperties();

ciclo attraverso essa:

    foreach (PropertyInfo item in info)
    {
        if (item.CanWrite)
        {
             switch (item.Name)
             {
                 case "ClientName"
                     // A property exists inside the control": //
                     item.SetValue(userControl, "john", null); 
                     // john is the new value here
                 break;
             }
        }
    }

vorrei solo incoraggiarvi questo se non è possibile accedere ai controlli utente e ci sono decine di loro con un sacco di proprietà delle variabili per UserControl. (Si può ottenere molto brutto, lento e non fail-safe)

Altri suggerimenti

Non sono sicuro di come si può fare genericamente, ma sembra che si sta caricando il controllo utente proprio in ogni caso. Prova a trasmettere l'UserControl al tipo di controllo che si sta utilizzando, per esempio.

 // Create instance of the user control 
    MyUserControl userControl = (MyUserControl)page.LoadControl("/MyUserControl.ascx"); 

  userControl.Param1="my param";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top