Как мы можем загрузить usercontrol, используя универсальный обработчик? - PullRequest
5 голосов
/ 31 марта 2011

Я хочу загрузить пользовательский элемент управления, используя jquery ajax. Один из возможных вариантов - загрузить usercontrol через универсальный обработчик. Любой, помогите мне, пожалуйста. здесь код ajax, который я использую для вызова элемента управления.

 <script type="text/javascript">
 function fillSigns() { 
                $.ajax({
                    url: "usercontrolhandler.ashx?control=signs.ascx",
                    context: document.body,
                    success: function (data) {                       
                        $('#signdiv').html(data);
                    }
                });
            }  
 </script>

и вот код в файле обработчика

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        Page page = new Page();
        UserControl ctrl = (UserControl)page.LoadControl("~/" + context.Request["control"] + ".ascx");      
        page.Form.Controls.Add(ctrl);

        StringWriter stringWriter = new StringWriter();
        HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
        ctrl.RenderControl(tw);
        context.Response.Write(stringWriter.ToString());
    } 

Этот код вызывает ошибку ссылки на объект, не найденную в указанной ниже строке.

 page.Form.Controls.Add(ctrl);

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Кажется, page.Form здесь null, поэтому у вас исключение нулевой ссылки. Вместо этого вы можете добавить свой пользовательский элемент управления в коллекцию элементов управления страницы:

page.Controls.Add(ctrl);

Вы также можете использовать HttpServerUtility.Execute метод для рендеринга страницы:

StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(page, output, false);

И, наконец, взглянем на Совет / хитрость: крутая техника шаблонирования пользовательского интерфейса для использования с ASP.NET AJAX для сценариев без UpdatePanel статья Скотта Гатри, которая освещает вашу проблему.

1 голос
/ 02 апреля 2013

Попробуйте:

Page page = new Page {ViewStateMode = ViewStateMode.Disabled};
HtmlForm form = new HtmlForm { ViewStateMode = ViewStateMode.Disabled };
form.Controls.Add(ctrl);
page.Controls.Add(form);

, затем:

StringWriter stringWriter = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
page.RenderControl(tw);
context.Response.Write(stringWriter.ToString());
...