2015-12-15 4 views
1

Я создал элемент управления веб-пользователей, который имеет некоторые элементы управления ASP.NET и сторонних разработчиков.Как визуализировать клиентскую часть WebUserControl

Я уже проверил свой контроль над разметкой страницы, и она работает хорошо.

<APP:MyControl ID="myControl1" InitializeWithValue="Employee" /> 
<APP:MyControl ID="myControl2" InitializeWithValue="Supplier" /> 

Теперь я хочу, чтобы этот элемент управления отображался на той же странице, но не тогда, когда страница отображается в первый раз. Фактически, я нажму кнопку, которая вызовет обратный вызов, и в этот момент я хочу отобразить элемент управления.

Я пытался сделать что-то вроде этого.

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) 
{ 
    MyControl c1 = new MyControl(); 
    c1.InitializeWithValue = Person.Enum.Employee; //<--CRASH 

    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    System.IO.StringWriter sw = new System.IO.StringWriter(sb); 
    HtmlTextWriter hw = new HtmlTextWriter(sw); 
    c1.RenderControl(hw); 
    return sb.ToString(); 
} 

Тогда на моей стороне клиента приемника

<a href="javascript:void(0);" onclick="testcallback('', '')">Test</a> 
<div id="divControls"></div> 

<script> 
    function receiver(arguments, context) { 
     document.getElementById('divControls').innerHTML = arguments; 
    } 
</script> 

Но это аварии в момент инициализации, потому что все внутренние элементы управления в WebUserControl равны нулю. Они не были инициализированы.

Это свойство управления

[Browsable(true)] 
    public Person.Enum InitializeWithValue 
    { 
     get { return this.enumPersonValue; } 
     set 
     { 
     this.enumPersonValue = value; 
     //Literal control 
     this.litPersonType.Text = "Employee"; //<-- CRASH because litPersonType is null. 
     } 
    } 

Некоторые из них могут помочь мне исправить это или предложить мне другой способ визуализации веб-контроль, но на стороне клиента?

ответ

0

UserControls обычно крепятся к жизненному циклу страницы, поэтому вам нужно будет воссоздать целую страницу и отобразить ее вместо этого.

Во-вторых, вы должны загрузить свой usercontrol, используя его .ascx-файл, а не только его класс, это необходимо, потому что недостаточно только вашего класса.

Вы все еще можете попробовать сделать, как вы делаете только создание, но с использованием Page.LoadControl:

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) 
{ 
    MyControl c1 = (MyControl)page.LoadControl("/Controls/myControl.ascx"); 
    c1.InitializeWithValue = Person.Enum.Employee; //<--CRASH 

    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    System.IO.StringWriter sw = new System.IO.StringWriter(sb); 
    HtmlTextWriter hw = new HtmlTextWriter(sw); 
    c1.RenderControl(hw); 
    return sb.ToString(); 
} 

Но если элемент управление имеет событие, связанное с циклом жизни страницы вам, возможно, потребуется создать целый контекст к нему:

вы можете сделать все это так:

using (var stringWriter = new StringWriter()) 
{ 
     using (var page = new Page()) 
     { 
      MyControl myControl = (MyControl)page.LoadControl("/Controls/myControl.ascx"); 

      var head = new HtmlHead(); 
      page.Controls.Add(head); 

      var form = new HtmlForm(); 
      page.Controls.Add(form); 

      var div = new HtmlGenericControl("div"); 
      div.ID = "myControlContent"; 
      form.Controls.Add(div); 

      div.Controls.Add(myControl); 

      HttpContext.Current.Server.Execute(page, stringWriter, false); 

     } 
     return stringWriter.ToString() 
} 

Тогда в ваших JS вы можете разобрать весь HTML и получить только innerHTML из div#myControlContent, например:

function receiver(arguments, context) { 
    var parser = new DOMParser(); 
    var doc = parser.parseFromString(arguments, "text/html"); 

    document.getElementById('divControls').innerHTML = doc.getElementById('myControlContent').innerHTML; 
} 

DOMParser отмечает, что, доступен только в Mordern браузеров, но вы можете найти другие approachs для старых браузеров ...

+0

Спасибо за ответ. Теперь с LoadControl я могу управлять элементом управления правильно, но что, если моя текущая страница, которая будет удерживать элемент управления, - это страница, которая содержится внутри MasterPage.Master, и я не хочу воссоздать все. –

+0

Забудьте мой вопрос. Я передал свою Page_Load внутри своего элемента управления, и я вызываю его непосредственно в приватном методе. Я пытался контролировать страницу.IsPostBack, которая больше не имеет смысла. Оно работает. Благодарю. –

+0

Я применил первый способ, рекомендованный вами, но знаете ли вы, как разрешить рендеринг элементов управления Telerik? Я получил исключение: «Сценарий« dateInput »не зарегистрирован в управлении скриптом ...» Я просто использую RadDateTimePicker внутри моего WebUserControl, ничего особенного. Я продолжу изучать это, но, возможно, вы знаете, как решить Это спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^