Как преобразовать страницу ASP.NET с помощью веб-методов Ajax в серверный контроль с поддержкой Ajax? - PullRequest
3 голосов
/ 03 декабря 2008

В в этом уроке, который я читаю , Дейв Уорд создает страницу, которая показывает дату сервера в метке, без использования панели обновления.

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

Я создал страницу, код и javascript в точности так, как указано в статье, и получил образец для работы.

Итак, чтобы начать пытаться преобразовать это в управление сервером, я переместил Javascript Дэйва для страницы в файл, ~ tests / JScript.js:

 function UpdateTime() {
   PageMethods.GetCurrentDate(OnSucceeded, OnFailed); 
 }

 function OnSucceeded(result, userContext, methodName) {
   $get('Literal1').innerHTML = result; 
 }

 function OnFailed(error, userContext, methodName) {
   $get('Literal1').innerHTML = "An error occured.";
 }

И поместите следующий класс в мой App_Code:

namespace foo
{
    /// <summary>
    /// Summary description for ServerControlTest
    /// </summary>
    public class ServerControlTest : CompositeControl, IScriptControl
    {
        ScriptManager sm;
        protected override void OnPreRender(EventArgs e)
        {
            if (!this.DesignMode)
            {
                // Test for ScriptManager and register if it exists
                sm = ScriptManager.GetCurrent(Page);

                if (sm == null)
                    throw new HttpException("A ScriptManager control must exist on the current page.");

                sm.RegisterScriptControl(this);
                sm.EnablePageMethods = true;
            }

            base.OnPreRender(e);
        }

        protected override void OnLoad(EventArgs e)
        {
            Literal lit = new Literal();
            lit.Text = "<span ID=\"Literal1\" runat=\"server\">test</span><input id=\"Button1\" type=\"button\" value=\"button\"  onclick=\"UpdateTime();\" />";

            this.Controls.Add(lit);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            if (!this.DesignMode)
                sm.RegisterScriptDescriptors(this);

            base.Render(writer);
        }

        [WebMethod]
        public static string GetCurrentDate()
        {
            return DateTime.Now.ToString();
        }

        #region IScriptControl Members

        IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
        {
            return null;
        }

        IEnumerable<ScriptReference> IScriptControl.GetScriptReferences()
        {
            ScriptReference reference = new ScriptReference();
            reference.Path = ResolveClientUrl("~/tests/JScript.js");

            return new ScriptReference[] { reference };
        }

        #endregion
    }
}

Теперь, на моей странице примера, когда я нажимаю кнопку, я получаю эту ошибку: PageMethods не определен [Перерыв на этой ошибке] PageMethods.GetCurrentDate (OnSucceeded, OnFailed);

Как мне вызвать GetCurrentDate из клиентского сценария, который регистрирует мой элемент управления?

1 Ответ

2 голосов
/ 03 декабря 2008

На самом деле, начиная с версии 3.5, не существует полностью инкапсулированного метода для реализации обратных вызовов AJAX для методов серверного элемента управления. Это очень неприятное ограничение.

Наиболее распространенным решением является создание HttpHandler в сборке вашего серверного элемента управления, а затем требуется, чтобы обработчик был зарегистрирован в web.config. Посмотрите, как ASP.NET AJAX ScriptResource.axd подключен в web.config в ASP.NET AJAX 1.0, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...