проблема с формами при загрузке ascx в веб-сервис с jquery - PullRequest
0 голосов
/ 06 августа 2009

Я использовал этот пример и создал форму в элементе управления ascx.

http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

проблема в том, что всякий раз, когда я размещаю кнопку asp.net или панель обновления, ascx не загружается. В чем может быть проблема?

Ответы [ 3 ]

1 голос
/ 10 августа 2009

Я обнаружил, что вам нужно поместить элемент управления в класс HtmlForm, а затем HtmlForm в класс Page.

Вместо этого я прибегаю к использованию IFrames. Может быть, я буду использовать эту технику по-другому.

спасибо за усилия.

0 голосов
/ 06 августа 2009

спасибо за совет. Тем не менее, я получил ту же ошибку:

"System.Web.HttpException: элемент управления 'ctl00_Button1' типа 'Button' должен быть помещен в тег формы с помощью runat = server."

Я загружаю элемент управления внутри динамической JS JQuery вкладки.

$.ajax({
                type: "POST",
                url: "TabLoader.asmx/LoadNewTab",
                data: "{'fullname':'" + fullname +
                      "', 'id':'" + id + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                $(tabName).html(msg.d);
                }
            });

и для asmx:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
[Serializable]
public class TabLoader : System.Web.Services.WebService
{
    private Page _page;

    [WebMethod]
    public string LoadNewTab(string fullname, string id)
    {
        _page = new Page();
        UserControl ctl = LoadControl("~/controls/ctrlTabContent.ascx", 
                                      fullname, 
                                      Convert.ToInt32(id));
        _page.Controls.Add(ctl);

        StringWriter writer = new StringWriter();
        HttpContext.Current.Server.Execute(_page, 
                                           writer, 
                                           false);

        return writer.ToString();
    }

    private UserControl LoadControl(string userControlPath, 
                                    params object[] constructorParams)
    {
        List<Type> constParamTypes = new List<Type>();
        foreach (object cp in constructorParams)
        {
            constParamTypes.Add(cp.GetType());
        }

        UserControl userCtrl = (UserControl)_page.LoadControl(userControlPath);
        ConstructorInfo constructor = userCtrl.GetType().BaseType.GetConstructor(constParamTypes.ToArray());
        if (constructor == null)
            throw new MemberAccessException("The requested constructor was not found on : " + userCtrl.GetType().BaseType.ToString());
        else
            constructor.Invoke(userCtrl, constructorParams);

        return userCtrl;
    }
}
0 голосов
/ 06 августа 2009

Вы установили точку останова в методе вашего веб-сервиса, чтобы увидеть, действительно ли он попадает в веб-сервис?

Другой вариант, на который я бы посмотрел, - это использование таблицы стилей XML и просто преобразование этих данных с использованием таблицы стилей и элемента управления XML Server. Это потребует меньше затрат, чем добавление панели обновления и вызов веб-службы для вашего преобразования.

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

В вашем aspx убедитесь, что ваш код выглядит примерно так:

     <form id="form1" runat="server">
      <asp:ScriptManager runat="server">
        <Services>
          <asp:ServiceReference Path="~/RSSReader.asmx" />
        </Services>
        <Scripts>
          <asp:ScriptReference Path="~/Default.js" />
        </Scripts>
      </asp:ScriptManager>
     </form>
    <div id="Container">
      <div id="RSSBlock">
        <div id="RSSContent" class="loading"></div>
      </div>    
      <div id="Content">
      <p></p>
      </div>
    </div>

Кроме того, его руководство не упоминает об этом, но вы должны иметь этот атрибут в классе вашего веб-сервиса, чтобы его можно было вызывать из JavaScript:

[System.Web.Script.Services.ScriptService]

Кроме этих идей, я должен был бы увидеть ваш код.

...