2

我使用 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但我真的不确定如何使用它,非常感谢!

4

2 回答 2

10

您可以在用户控件上为适当的参数实现接口。

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

完毕,

您可以在那里为多种目的添加多个接口。如果用户控件没有实现接口,if语句将避免使用它

但是,如果您真的无法访问用户控件,并且您知道“一点”要设置的属性以及它们是什么类型,请尝试使用反射更动态的方式:

加载用户控件:

    UserControl userControl = (UserControl)Page.LoadControl(@"~/WebUserControl.ascx");

获取加载的用户控件的属性:

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

如果您无法访问用户控件,并且每个用户控件有许多具有大量可变属性的用户控件,我只会鼓励您这样做。(它会变得非常丑陋、缓慢且不安全)

于 2010-09-19T18:48:57.237 回答
1

我不确定它是如何通用的,但看起来你无论如何都在加载你自己的用户控件。例如,尝试将 UserControl 转换为您正在使用的控件的类型。

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

  userControl.Param1="my param";
于 2010-09-19T17:48:50.317 回答