Разрешение ввода текстового поля после обратной передачи при нажатии клавиши

Я пытаюсь создать текстовое поле, которое выполняет функцию С # при нажатии клавиши, поэтому я заказал функцию javascript для обратной передачи при событии нажатия клавиши текстового поля, в основном, что произошло, у меня было текстовое поле на autopostback = true, а функция С # выполнялась только тогда, когда щелчок за пределами поля из-за автоматической отправки, поэтому я хотел достичь той же цели, но без щелчка снаружи, только с нажатой клавишей. вот мой код:

   <script language="javascript" type="text/javascript">
   function RefreshBox() 
 {
   __doPostBack('<%= SomeTextBox.ClientID%>', '');
 }

   <asp:TextBox ID="SomeTextBox" runat="server" onkeydown="RefreshQueryBox();" 
   AutoPostBack="True" ValidationGroup="1" 
   ontextchanged="AutoText_TextChanged" ViewStateMode="Enabled"></asp:TextBox>

here's the .cs

        protected void AutoText_TextChanged(object sender, EventArgs e)
{
// Some actions here
}

Проблема в том, что с этим кодом вся страница обновляется при нажатии клавиши, и пользователь не может печатать. Помощь! :П

Спасибо


person user3378869    schedule 15.05.2014    source источник
comment
Хорошо, что вы хотите, вообще не имеет смысла в веб-приложении. Вам нужно будет использовать Ajax.net для решения вашей проблемы.   -  person Dalorzo    schedule 16.05.2014


Ответы (1)


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

function AutoText(){
$.ajax({
  type: 'POST',
  url: '../Services/UpdateService.asmx/AutoText',
  data: '',
  contentType: "application/json; charset=utf-8",
  success: function (data) {
          //use the data.d to get the info passed back from webservice. then 
          add your logic to update your html
  },
  error: function () {
     //catch any bad data
  } 
 });
}

ваш бэкэнд-метод должен выглядеть так. Объект - это то, чем является ваш объект

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Object GetLatest()
    {
        Object obj= new Object ();

        obj.FirstName = "Dave";
        obj.LastName = "Ward";

 return obj;
}

Если вы проводите проверку, я бы посоветовал jquery / javascript. Хотя вы рискуете, что кто-то не разрешит использование javascript в своем веб-браузере, вы перекладываете нагрузку на сервер.

person Matthew Wong    schedule 15.05.2014
comment
Да, я должен был упомянуть, что не могу использовать Ajax в этом случае, в основном то, что я хочу, - это та же обратная передача, которую я получаю при нажатии на страницу с автоматической отправкой, если это вообще возможно. - person user3378869; 17.05.2014
comment
Тогда я бы обернул ваше текстовое поле в панель обновлений. Затем я бы сделал updatepanel.update () в вашем коде. Кроме того, я бы установил для вашей панели обновления значение UpdateMode = conditional. Таким образом, вы все еще можете отправлять сообщения, но вместо перезагрузки всей страницы только ваш раздел с панелью обновлений будет - person Matthew Wong; 17.05.2014
comment
Спасибо, ваше предложение очень помогает, теперь я изменил событие с onkeydown на onkeyup, чтобы оно позволяло мне писать, проблема в том, что каждый раз, когда я набираю его, расфокусируется из текстового поля, я пробовал document.getElementById (SomeTextBox) .focus () ; но он по-прежнему не позволяет мне писать нормально, однако он выполняет функцию, но не совсем по нажатию клавиши, а через несколько секунд после того, как я закончу печатать. - person user3378869; 17.05.2014
comment
С и обновить панель. После того, как вы выполните updatepanel.update (), вам необходимо повторно зарегистрировать свои javascripts. пример: ScriptManager.RegisterStartupScript (this.updatePaneLid, this.GetType (), Show_Font, showFont () ;, true); где showFont - это функция javascript, которая устанавливает фокус обратно на текстовое поле - person Matthew Wong; 18.05.2014
comment
Я так и сделал, но он все еще расфокусируется, я обернул 2 текстовых поля в одной панели обновлений, может это мешает? В любом случае моя функция javascript и код диспетчера сценариев: UpdateAuto.Update (); ScriptManager.RegisterStartupScript (this.UpdateAuto, this.GetType (), Show_Font, FocusTextBox () ;, true); функция FocusTextBox () {document.getElementById (SomeTextBox) .focus (); } - person user3378869; 18.05.2014
comment
Если оба ваших текстовых поля не имеют одинаковый идентификатор, я не думаю, что это помешает ему. Вы пробовали отлаживать / проходить через свой javascript? У меня такое ощущение, что ваш javascript не получает доступ к панели обновлений. - person Matthew Wong; 18.05.2014
comment
Вы правы, он не обращается к нему напрямую, я только __doPostBack на SomeTextBox. Какую функцию мне следует использовать на панели обновлений? - person user3378869; 19.05.2014
comment
Так что я изучил это подробнее. Похоже, я сказал вам неправильную строку кода выше. Попробуйте этот ScriptManager.RegisterClientScriptBlock (this.Page, this.Page.GetType (), script, alert ('Участник успешно зарегистрирован'); true). Либо передайте функцию, либо явно вызовите свой js-скрипт. IE: document.getElementById (SomeTextBox) .focus (). Полный код должен выглядеть так. ScriptManager.RegisterClientScriptBlock (this.Page, this.Page.GetType (), скрипт, функция focusTxtBox () {document.getElementById (SomeTextBox) .focus ();}, true) - person Matthew Wong; 20.05.2014
comment
Да, это вообще не работает, я полагаю, вы имели в виду вместо this.Page this.UpdatePanel, так или иначе, я попробовал оба и отключил SomeTextBox в вызове функции, потому что он нарушает структуру строки и это проблематично. - person user3378869; 20.05.2014
comment
Хм ... Можете ли вы скопировать фрагмент кода, в котором вы выполняете обновление panel.update, а также раздел, в котором ваша панель обновления находится в вашем aspx. знак равно - person Matthew Wong; 20.05.2014
comment
protected void Page_Load (объект-отправитель, EventArgs e) {UpdateAuto.Update (); ScriptManager.RegisterClientScriptBlock (this.UpdateAuto, this.UpdateAuto.GetType (), скрипт, функция FocusTextBox () {document.getElementById (SomeTextBox) .focus ();}, true); } - person user3378869; 20.05.2014
comment
Панель обновления слишком длинная, она в основном после / div, а там, где находятся текстовые поля, она содержит 2 текстовых поля. - person user3378869; 20.05.2014
comment
Page_Load (отправитель объекта, EventArgs e) {UpdateAuto.Update (); ScriptManager.RegisterClientScriptBlock (this.Page, this.Page.GetType (), скрипт, функция FocusTextBox () {document.getElementById (\ SomeTextBox \). Focus ();}, true); - person Matthew Wong; 21.05.2014
comment
Надеюсь, это сработает. Если нет, то я думаю, что мне было бы полезнее увидеть больше вашего кода, чтобы я мог помочь вам отладить. трудно понять, почему вы получаете ошибки, когда ваш код кажется правильным - person Matthew Wong; 21.05.2014
comment
Нет, это не работает, просто для ясности, я не получаю никаких ошибок, единственное, когда я печатаю, он расфокусируется из текстового поля - person user3378869; 21.05.2014