2010-10-05 5 views

ответ

33

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

Давайте взглянем на код и перейдем к нему по частям.

Поскольку ASP.Net TextBox не предоставляет серверное событие для OnBlur, вам придется делать это вручную. К счастью, этого довольно легко достичь. Предположим, у вас есть этот маленький бит кода на вашей странице .aspx. Вы хотите обновить сервер сервера управления Label всякий раз, когда TextBox теряет фокус.

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br /> 
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br /> 
<asp:Label ID="lblOutput" runat="server" /> 

ASP.Net имеет встроенный client side function, который вызывается для запуска постбэки, которая принимает два параметра:

  1. Target (идентификатор управления вызывает событие)
  2. Аргумент (необязательная информация вы хотели бы передать на сервер)

вы могли только wireup события в разметке по добавив следующий атрибут и значение для вашего TextBox:

onblur="__doPostBack('tbOnBlur','OnBlur');" 

Однако структура имеет легкий способ создания скрипта для вас стороны сервера. В вашем методе Page_Init, просто добавьте вызов GetPostBackEventReference и назначить его на «ONBLUR» атрибут для вас контролировать, как так:

protected void Page_Init(object sender, EventArgs e) 
{ 
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur"); 
    tbOnBlur.Attributes.Add("onblur", onBlurScript); 
} 

С стандартными событиями управления сервером, то wireup события и вызов обрабатываются автоматически для вас осуществление IPostBackEventHandler. Это большая работа для одноразового решения, поэтому давайте просто обрабатываем его вручную, проверяя параметры запроса.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     var ctrlName = Request.Params[Page.postEventSourceID]; 
     var args = Request.Params[Page.postEventArgumentID]; 

     HandleCustomPostbackEvent(ctrlName, args); 
    } 
} 

private void HandleCustomPostbackEvent(string ctrlName, string args) 
{ 
    //Since this will get called for every postback, we only 
    // want to handle a specific combination of control 
    // and argument. 
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur") 
    { 
     lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now; 
    } 
} 

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

Надеюсь, это поможет!

Приветствия,
Джош

+0

+1 Джош. Это было очень информативно. –

+0

Большое спасибо за ваш прекрасный ответ Genii. Ваш пост очень информативен для меня. –

+0

Я видел несколько других предложений о том, как это сделать, и ваш ответ, безусловно, лучший. Благодаря! – Aaron

4
if (!Page.IsPostBack) 
    { 
     txtName.Attributes.Add("onblur","alert('Hello world')"); 
    } 
14

Если вы хотите, чтобы сервер сделать что-то после того, как текстовое поле теряет фокус вы можете добавить AutoPostBack = «True», и, если вы не хотите, постбэк перезагрузить всю страницу, используйте UpdatePanel:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
          OnTextChanged="TextBox1_TextChanged" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

Функция TextBox1_TextChanged может затем что-то сделать с текстом (serveride).

+0

из интереса - как же UpdatePanel остановить перезагрузку всей страницы – Kamal

+0

@Kamal ... это не так.Панель обновления не делает ничего, чтобы предотвратить загрузку всей страницы на сервере. По существу, происходит то, что postback выполняется на стороне клиента с помощью XmlHttpRequest, и затем все содержимое, содержащее UpdatePanel, отбрасывается и возвращается. Это облегчает «мерцание» нормальной обратной передачи, но не сохраняет обработку времени на сервере. – Josh

+4

Он перезагружает всю страницу, но только отправляет html обновленной панели (ов) и некоторого javascript для обновления содержимого в ответе. Ответ может быть намного меньше, чем загрузка всей страницы, и браузер не должен повторно отображать страницу. Это может немного ускорить процесс, пользователь не заметит какого-либо мерцания, и опыт будет намного более плавным. – Willem

0

Почему вы не использовать. LostFocus работает так же с:

OnTextChanged="TextBox_TextChanged" 
Смежные вопросы