質問

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

インターフェイスを介してコントロールをアクセスします

  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