Senden Parameter in dynamisch geladenen Benutzersteuer
-
04-10-2019 - |
Frage
ich den Inhalt einiger User Controls in meine Seite mit der Verwendung von jQuery laden. So hat ich diese Funktion, dass Extrakte der Inhalt von meiner Benutzerkontrolle, und es funktioniert wie ein Charme.
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;
}
Aber ich möchte wirklich in einigen Parametern in meine User Control zu senden, wenn ich es schaffen. Ist dies möglich, und wie kann ich das tun?
kann ich das LoadControl()
sehe einige Parameter mit object[] parameters
nehmen kann, aber im wirklich nicht sicher, wie es zu benutzen, Hilfe zu schätzen!
Lösung
Sie können eine Schnittstelle auf Ihrem Usercontrol für die entsprechenden params implementieren.
public interface ICustomParams
{
string UserName { get; set; }
DateTime SelectedDate { get; set; }
}
implementieren die Schnittstelle in der Usercontrol, wie diese
public partial class WebUserControl : System.Web.UI.UserControl , ICustomParams
{
public string UserName { get; set; }
public DateTime SelectedDate { get; set; }
}
dann laden Sie Ihre Steuerung:
UserControl userControl = (UserControl)page.LoadControl(pathToControl);
Acces die Kontrolle über die Schnittstelle
ICustomParams ucontrol = userControl as ICustomParams;
if(ucontrol!=null)
{
ucontrol.UserName = "henry";
ucontrol.SelectedDate = DateTime.Now;
}
Fertig,
Sie können dort mehrere Schnittstellen für mehrere Zwecke hinzufügen. Wenn die Usercontrol nicht die Schnittstelle implementiert, wird die if-Anweisung vermeidet es mit
Aber wenn Sie wirklich keinen Zugriff auf die Benutzersteuerelemente und Sie wissen, „ein wenig“ der Eigenschaften, die Sie festlegen möchten und welche Art sie sind versuchen, eine dynamischere Art und Weise mit Reflexion:
laden Sie die Usercontrol:
UserControl userControl = (UserControl)Page.LoadControl(@"~/WebUserControl.ascx");
erhält die Eigenschaften des geladenen Usercontrol:
PropertyInfo[] info = userControl.GetType().GetProperties();
Schleife durch sie:
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;
}
}
}
Ich möchte Sie nur ermutigen, diese Option, wenn Sie nicht die Benutzersteuerelemente zugreifen können und es gibt Dutzende von ihnen mit viel, viel variablen Eigenschaften pro Usercontrol. (Es kann sehr hässlich, langsam und nicht ausfallsicher)
Andere Tipps
Ich bin sicher nicht, wie es allgemein getan werden kann, aber es sieht aus wie du bist Laden sowieso eigene Benutzerkontrolle. Versuchen Sie, die das Usercontrol auf die Art des Steuer Gießen Sie verwenden, zum Beispiel.
// Create instance of the user control
MyUserControl userControl = (MyUserControl)page.LoadControl("/MyUserControl.ascx");
userControl.Param1="my param";