Отправить параметры в динамически загруженный пользовательский элемент управления
-
04-10-2019 - |
Вопрос
Я загружаю содержание некоторых пользовательских элементов управления на мою страницу с использованием jQuery. Поэтому у меня есть эта функция, которая извлекает контент от моего контроля пользователя, и он работает как очарование.
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;
}
Но я бы очень хотел отправить некоторые параметры в мой контроль пользователя, когда я его создаю. Это возможно, и как я могу это сделать?
я вижу LoadControl()
может принять несколько параметров с object[] parameters
Но я действительно не уверен, как его использовать, помогите много ценится!
Решение
Вы можете реализовать интерфейс на ваш USERCONTROL для соответствующих параметров.
public interface ICustomParams
{
string UserName { get; set; }
DateTime SelectedDate { get; set; }
}
реализовать интерфейс в USERCONTROL, как это
public partial class WebUserControl : System.Web.UI.UserControl , ICustomParams
{
public string UserName { get; set; }
public DateTime SelectedDate { get; set; }
}
Затем загрузите свой контроль:
UserControl userControl = (UserControl)page.LoadControl(pathToControl);
Acces Control через интерфейс
ICustomParams ucontrol = userControl as ICustomParams;
if(ucontrol!=null)
{
ucontrol.UserName = "henry";
ucontrol.SelectedDate = DateTime.Now;
}
Сделанный,
Вы можете добавить несколько интерфейсов для нескольких целей там. Если у USERCONTROL не реализован интерфейсом, если утверждение IF избегает его использования
Но если вы действительно не можете получить доступ к USERCONTROLS, и вы знаете «немного» о свойств, которые вы хотите установить, и какой тип они пытаются более динамичный способ с отражением:
Загрузить USERCONTROL:
UserControl userControl = (UserControl)Page.LoadControl(@"~/WebUserControl.ascx");
Получить свойства загруженного USERCONTROL:
PropertyInfo[] info = userControl.GetType().GetProperties();
петли через это:
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;
}
}
}
Я бы только поощрял вам это, если не сможете получить доступ к UserControls, и есть десятки из них с большим количеством и множеством вариабельных свойств на USERCONTROL. (Это может стать очень уродливым, медленным и не в случае неудачно)
Другие советы
Я не уверен, как это можно сделать в целом, но похоже, что вы загружаете свой собственный пользовательский контроль в любом случае. Попробуйте кастинг usercontrol к типу элемента управления, который вы используете, например.
// Create instance of the user control
MyUserControl userControl = (MyUserControl)page.LoadControl("/MyUserControl.ascx");
userControl.Param1="my param";