動的にロードされたユーザーコントロールにパラメーターを送信します
-
04-10-2019 - |
質問
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";