Compartilhar via


Рецепт передачи параметров веб-части в 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 removed

  • Anonymous
    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