2013-07-20 5 views
1

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

function countrypostback() { 
     $('#countryid').val($('select[name="countryselect"]').val()); 
     __doPostBack('upnlSearch', ''); 
    } 

$(document).ready(function() { 
       $.ajax({ 
     type: "GET", 
     url: "/service.svc/countries/", 
     data: "", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      for (var i in msg) { 
       var resultitems = '<select onchange="countrypostback();" class="textbox" name="countryselect" id="countryselect">'; 
       for (var i in msg) { 
        if (msg[i].name != '') { 
         resultitems += '<option value="' + msg[i].value + '">' + msg[i].name + '</option>'; 
        } 
       } 
       resultitems += '</select>'; 
       $('#countryselect').html(resultitems); 
      } 
     } 
    }); 

    //here I'm trying to set the value of the dropdown to the value that was selected before the postback 
    $("#countryselect").val($('#countryid').val()); 


    <input type="hidden" id="countryid" name="countryid" /> 

<asp:UpdatePanel ID="upnlSearch" runat="server"> 
<ContentTemplate> 


<span id="countryselect"></span> 

</ContentTemplate> 
</asp:UpdatePanel> 

Я попытался размещением скрытого поля CountryId как снаружи, так и внутри UpdatePanel, но это не делает разницы, я до сих пор пустое поле формы, когда я пытаюсь получить доступ к нему через

$('#countryid').val() 

I скорее всего, не будет работать с viewstate (если это вообще возможно), так как это увеличит значение pageload.

+0

тьфу asp.net кошмар, я ненавидела обновления панели и неустановленных Visual Studio и их другие дрянные "инструменты". Причина заключается лишь в том, что при вызове обратной передачи вы не можете отслеживать значение, если оно не сохраняется в cookie или сеансе. не уверен, как переопределить панели обновлений или, если можно, то, что я сделал бы, это избавиться от реалистичной реализации ajax от Microsoft и создать свой собственный, используя jQuery AJAX. –

ответ

1

Без обратной передачи было бы так просто, как это возможно, вы, вероятно, можете предотвратить обратную передачу, используя event.preventDefault(). Проблема, которую я обнаружил в панелях обновления Microsoft, - это код на стороне сервера, который всегда выполняется перед клиентским кодом, поэтому трудно или почти невозможно предотвратить действия по умолчанию. Всегда думал, что это было немым и их уникальные идентификаторы, которые полностью не позволяют выбрать что-либо с помощью jQuery.

$('select').on('change', function(ev){ 
    ev.preventDefault(); 
    alert($(this).val()); 
}); 

http://jsfiddle.net/NtzRC/1/

+0

Хорошо, но с помощью обратной передачи по умолчанию позволяет легко выполнять код на стороне сервера. Если бы я пошел с jQuery: у вас есть образец, если вообще возможно, для вызова метода стороне сервера, не относящегося к веб-сервису, и получить возвращаемое значение как целое число? Функциональная подпись: Частная функция ShowSearchResults (байральная страна как целое, округлая область как целое, байтовые комнаты как целое) как Integer. Функция фактически имеет больше параметров, но вы получаете эту идею. – Flo

+0

вы можете обрабатывать отображение страниц с помощью ** ClientIDMode ** в .net 4.0 или просто использовать что-то вроде ** Ctype (fvData.findControl («mycontrol»)). ClientID ** – eyegropram

1

Это может помочь вам там.

<script type="text/javascript"> 
    // execute script once 
    [javascript code] 
    // register script with PageRequestManager for partialpostback "reset value of control" 
    if(typeof(Sys)!=='undefined'){ 
    if(typeof(Sys.WebForms)!=='undefined'){ 
    if(typeof(Sys.WebForms.PageRequestManager)!=='undefined'){ 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function(){ 
    [javascript code] 
    }); 
    } 
    } 
    } 
    </script> 
2

мая вы можете получить доступ к ServerSide на скрытое (Runat сервер), и там вы можете убедиться, что написано на странице снова. В противном случае у вас есть некоторые возможности для хранения его клиентов, но ни один из них не симпатичен.

1

e.preventDefault(); является идеальным решением, особенно при работе с JQuery и Ajax. Ниже приведен пример события нажатия кнопки, который обрабатывает ошибки в JQuery
, используя обязательные поля ASP.NET, после чего помещает массив в веб-службу на странице .aspx , которая возвращает значение, которое нужно сохранить в элементе управления скрытым полем. После того как веб-служба возвращает значение, которое будет храниться в скрытом поле, полная функция отображает сообщение об успешном завершении в метке на основе логического значения, присвоенного функцией . Вот мой пример.

$(document).ready(function() { 
$("#<%=btnApply.ClientID %>").click(function (e) { 
    var formtitle = $("#<%=txtFormTitle.ClientID %>"); 
    var email = $("#<%=txtEmail.ClientID %>"); 
    var tdform = $("#trform .tdform"); 
    var formId = $("#<%=hdnFormTemplateID.ClientID %>"); 
    var statuslabel = $("#<%=lblStatus.ClientID %>"); 
    var successful = false; 
    statuslabel.html(""); 

     if (!formtitle.val() || !email.val()) { 
     statuslabel.css("color", "#CC3300"); 
     statuslabel.html("The following fields are invalid!"); 
     return false; 
     } 
    else { 
    $.ajax({ 
    type: "POST", 
    url: "FormBuilder.aspx/GetFormElements", 
    traditional: true, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: JSON.stringify({ columnone: firstColumn, columntwo: secondColumn, title: formtitle.val(), emailaddress: email.val(), form: tdform.html(), formId: formId.val() }), 
    success: function (data) { 
     var id = $("#<%=hdnFormTemplateID.ClientID %>") 
     id.val(data.d); 
     successful = true; 
    }, 
    error: function (err) { 
     err = "Did not work"; 
     alert(err); 
    }, 
    complete: function() { 
     if (successful) { 
     var statuslabel = $("#<%=lblStatus.ClientID %>"); 
       statuslabel.html("");          
     statuslabel.css("color", "#92aa6c"); 
     statuslabel.html("Successfully Updated"); 

    } 
    } 
}); 
e.preventDefault(); 
    } 
}); 
}); 
Here is the web service sub procedure. I always find it helpful to have someone post 
VB.NET code and I will do so more in the future for those who prefer to work in 
VB.NET. 
Imports System.Web.Services 
Imports System.Web.Script.Services 
Imports System.Data.SqlClient 

<ScriptService()> 
Public Class FormBuilder 
Inherits System.Web.UI.Page 
Public Shared formTemplateId As Integer 


<WebMethod()> _ 
Public Shared Function GetFormElements(columnone As List(Of String), columntwo As 
    List(Of String), title As String, emailaddress As String, form As String, formId As 
    String) As String 
    Dim strconn As String = ConfigurationManager.AppSettings("ConnectionString") 
    Dim conn As New SqlConnection(strconn) 
    Dim mycommand As New SqlCommand 
    Dim retVal As Integer = 0 
    Dim itemOne As String = String.Empty 

    'mylogic to begin storing the data in the database using a For Loop' 
    If columnone.Count > 0 Then 
    For i As Integer = 0 To columnone.Count - 1 Step 1 
     itemOne = Regex.Replace(columnone(i).ToString, "\s", "") 
    Next 
    End If 


    Return retVal.ToString 

End Function 

End Class

Смежные вопросы