Ошибка Asp.net при создании пользовательского контроля из WebMethod - PullRequest
1 голос
/ 16 июня 2009

Я ссылаюсь на ссылку на статью

Чтобы динамически создать UserControl и передать его обратно на страницу через jQuery.

Когда я просто делаю простой текст в пользовательском элементе управления "Hello World", все работает отлично ... однако, когда я попытался поместить интерактивные элементы управления на элемент управления, я получил следующее сообщение в своем WebMethod (так что материал вызова jQuery не имеет значения) (дальнейшее тестирование показало, что текстовые поля и кнопки вызывают проблему, но не надписи)

Ошибка выполнения дочернего запроса для обработчика 'System.Web.UI.Page'

вот вебметод:

[WebMethod]
public static string GetCtrl(string cname)
{
    StringWriter sw = new StringWriter();

    Page p = new Page();
    Control c = p.LoadControl("~/Controls/" + cname);
    p.Controls.Add(c);

    try
    {
        HttpContext.Current.Server.Execute(p, sw, false);
    }
    catch (Exception err)
    {
        return err.Message;
    }
    sw.Close();

    return sw.ToString();
}

Исключение происходит во время вызова Server.Execute.

Решение может быть невозможным, я просто хотел бы знать, почему это вызвано интерактивными элементами управления.

EDIT: Следуя совету ниже, я посмотрел глубже и обнаружил, что внутреннее исключение говорит о том, что оно должно быть внутри тега формы, помеченного runat = "server", в то время как этот элемент управления отображается на странице aspx внутри тега формы ... Я предполагаю, что там должно быть какое-то «магическое» соединение asp.net, чтобы элемент управления работал… независимо от того, было бы неплохо знать, как отобразить страницу с элементами управления в любом случае (даже если она не может быть использован в этой ситуации)

Итак, я посмотрел на вывод приведенного выше кода и для любопытных:

<span id="ctl00_lbl1">abc: </span>

Таким образом, элемент управления отображается правильно (только с меткой id = 'lbl1') на странице, однако элемент управления отображается, а содержимое страницы вообще отсутствует ... Есть ли способ создать источник страницы, а? (Я не должен понимать, как работает функция Server.Execute)

Ответы [ 3 ]

3 голосов
/ 16 июня 2009

Я бы начал с сужения проблемы. Например, что произойдет, если вы отключите

p.Controls.Add(c);

Что произойдет, если вы правильно реализуете оператор using?

using (StringWriter sw = new StringWriter()) {
    // ...
    HttpContext.Current.Server.Execute(p, sw, false);
    return sw.ToString();
}

Что произойдет, если вы откажетесь от попытки / улова? Вся информация в исключении, кроме свойства Message, стоит вам, так почему бы просто не оставить ее? Ваш вызывающий может ожидать HTML в любом случае, поэтому, если вы сохраните его, вы можете (позже) обернуть вывод:

return "<p>" + ex.ToString() + "</p>";

Постепенно убирайте вещи, пока проблема не исчезнет.


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

1 голос
/ 18 января 2012

Используя блог Скотта Гу в качестве ссылки , я также столкнулся с той же проблемой при загрузке серверных элементов управления в мои виджеты (например, элементы управления GridView и RadTreeView могли вызвать ту же ошибку) для панели управления нашей компании. Следуя совету Джона Сондерса, я добавил элемент управления HTML-формы и менеджер сценариев (для элементов управления RadTreeView), и это устранило проблему. Теперь мои пользовательские элементы управления отображаются в виде чистого HTML. w00t!

[WebMethod]
public static string[] LoadWidget(string widgetID, string widgetPath)
{
    try
    {
        var pageHolder = new Page();
        var form = new HtmlForm();
        var viewControl = (UserControl)pageHolder.LoadControl(widgetPath);
        var scriptManager = new ScriptManager();
        form.Controls.Add(scriptManager);
        form.Controls.Add(viewControl);
        pageHolder.Controls.Add(form);

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

        return new string[]
        {
            widgetID, output.ToString()
        };
    }
    catch (Exception e)
    {
        // handle error...
    }
}
0 голосов
/ 16 июня 2009

Я бы попробовал отрисовать элемент управления и отправить эту строку обратно ...

Control ctrl;
StringBuilder sb = new StringBuilder();
StringWriter tw = new StringWriter(sb);
HtmlTextWriter hw = new HtmlTextWriter(tw);

ctrl.RenderControl(hw);
return sb.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...