Invia parametri in controlli utente caricati dinamicamente
-
04-10-2019 - |
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!
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";