Рецепт передачи параметров веб-части в ascx, если ascx не компилируется в dll
????????? ???????????????? ??????. ?? ?????? ???????????????? ??????? ?????????? (ascx) ??????? ????? ? ??? ? ????? ...\Template\CONTROLTEMPLATES ? ?? ????????????? ? ??????, ? ????????????? "?? ????". ?????? ???? ????? ?????? ??????? ???-?????, ??????? ???????? ? ???? ???? ??????? ?????????? ? ???????? ??? ??????????? ?????????.
? ???? ????????? ????????? ?????????:
public
class TestWebPart : System.Web.UI.WebControls.WebParts.WebPart{
private int pageSize = 25;
[WebBrowsable(
true),
Personalizable(PersonalizationScope.Shared),
DefaultValue(
"25"),
Category(
" "),
FriendlyNameAttribute(
"- "),
XmlElement(ElementName =
"PageSize")]
public int PageSize{get{return pageSize;}set{pageSize = value;}}
protected override void OnInit(EventArgs e){
base.OnInit(e);
this.ExportMode = WebPartExportMode.All;
UserControl ctrl = LoadControl("~/_controltemplates/TestUserControl.ascx", new object[1] { PageSize });
if (ctrl != null){this.Controls.Add(ctrl);}
}
private UserControl LoadControl(string UserControlPath, params object[] constructorParameters){
List<Type> constParamTypes = new List<Type>();
foreach (object constParam in constructorParameters) constParamTypes.Add(constParam.GetType());
UserControl ctl = Page.LoadControl(UserControlPath) as UserControl;
ConstructorInfo constructor = ctl.GetType().BaseType.GetConstructor(constParamTypes.ToArray());
if (constructor == null){throw new MemberAccessException("The requested constructor was not found on : " + ctl.GetType().BaseType.ToString());}else{constructor.Invoke(ctl, constructorParameters);}
return ctl;
}
}
Comments
Anonymous
January 01, 2003
Чем больше "л" в слове "компилируется", тем достойней был встречен Новый год. :)Anonymous
January 01, 2003
работает. Читай тему внимательнее. Это как раз тот случай когда весь твой контрол это один ascx. Чего там за экземпляр и интерфейс ты незнаешь. Контрол не в сборке. Сослаться в сборке на него или привести к какому-то типу неудастся. У тебя просто веб-часть не скомпиллируется.Anonymous
January 01, 2003
первая эт не сборка и в ней нет референсов. Это просто набор папокконтроловxml'ников. И превращать это в сборку незачем вообще. сделать надо было малой кровью. Вытаскивать один контрол в другую сборку не красиво.Anonymous
January 01, 2003
что-то в этом есть ) спасибки!Anonymous
January 01, 2003
The comment has been removedAnonymous
January 03, 2010
Тань, а оно работает? Вообще ConstructorInfo.Invoke возвращает экземпляр класса, связанного с конструктором. Почему по-человечески нельзя параметры передать, приведя контрол к известному интерфейсу и вызвав у него метод .LoadParameters, например?Anonymous
January 03, 2010
Ну а конструктор ты знаешь? Имхо некошерно после создания экземпляра контрола вызывать его конструктор, который еще и не без параметров, что для контролов вообще нестандартно. Можно пример привести такого контрола, а-то я в ситуацию не въезжаю.Anonymous
January 03, 2010
Да я понял и структуру и зачем это, почему нельзя в DLL вытащить :-) И уже даже понял, почему оно работает. В данном случае вызывается Invoke класса MethodInfo (он не переопределяется в ConstructorInfo). В общем, я лично сильно против вызовов конструктора уже созданного экземпляра через рефлексию, и против конструкторов с параметрами для .ascx-контролов. Если мы можем править сам контрол, который мы оборачиваем в веб-часть, я бы сделал в общей для этих двух сборок интерфейс, к которому бы приводил контрол и вызывал метод с установкой параметров.Anonymous
January 04, 2010
The comment has been removed