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 に答える