В в этом уроке, который я читаю , Дейв Уорд создает страницу, которая показывает дату сервера в метке, без использования панели обновления.
Я пытаюсь научиться создавать серверные элементы управления, которые используют 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 из клиентского сценария, который регистрирует мой элемент управления?