Отправка параметров в динамически загружаемые пользовательские элементы управления - PullRequest
2 голосов
/ 19 сентября 2010

Я загружаю содержимое некоторых пользовательских элементов управления на свою страницу с использованием 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, но я действительно не уверен в том, как его использовать, помогите очень признателен!

Ответы [ 2 ]

10 голосов
/ 19 сентября 2010

Вы можете реализовать интерфейс в вашем пользовательском контроле для соответствующих параметров.

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

реализовать интерфейс в пользовательском контроле, как это

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);

Доступ к управлению через интерфейс

  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;
             }
        }
    }

Я бы рекомендовал вам это только в том случае, если вы НЕ МОЖЕТЕ получить доступ к пользовательским элементам управления, и существуют десятки из них с большим количеством переменных свойств на один пользовательский элемент управления.(Это может стать очень уродливым, медленным и небезопасным)

1 голос
/ 19 сентября 2010

Я не уверен, как это можно сделать в общем, но похоже, что вы все равно загружаете свой собственный пользовательский элемент управления. Попробуйте привести пользовательский элемент управления к типу элемента управления, который вы используете, например.

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

  userControl.Param1="my param";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...