Отправить параметры в динамически загруженный пользовательский элемент управления

StackOverflow https://stackoverflow.com/questions/3746758

Вопрос

Я загружаю содержание некоторых пользовательских элементов управления на мою страницу с использованием 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";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top