2013-07-20 88 views
1

在用戶更改觸發updatepanel回發的select元素之後,我試圖在回發完成後將相同select的值設置爲所選值,但不知怎的,我在回傳後隱藏的字段丟失。如何在updatepanel回發後保留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內,但這並不有所作爲,我仍然有一個空formfield當我嘗試通過

$('#countryid').val() 

我訪問它'而不是與viewstate一起工作(如果可能的話),因爲這會增加pageload。

+0

唉asp.net的噩夢,我討厭更新面板和卸載Visual Studio和他們的其他蹩腳的「工具」。原因很簡單,因爲它導致回發,除非保存在cookie或會話中,否則無法追蹤該值。不知道如何覆蓋更新面板,或者如果可以的話,我會做的是擺脫微軟的低級ajax實現,並使用jQuery AJAX創建自己的。 –

回答

1

如果沒有回傳,它就像這樣簡單,你也可以使用event.preventDefault()來防止回發。我在微軟的更新面板中發現的問題是,服務器端代碼總是在客戶端代碼之前執行,所以很難或者幾乎不可能阻止默認操作。一直認爲這是愚蠢的,他們的獨特ID,這完全使得不可能選擇任何與jQuery。

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

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

+0

好的,但使用默認回發允許我輕鬆執行服務器端代碼。如果我願意用jQuery:你是否有一個樣本,如果可能的話,調用一個非web服務的服務器端方法,並得到一個整數的返回值? 函數簽名:Private函數ShowSearchResults(byval國家爲整數,byval省份爲整數,byval房間爲整數)爲Integer。該函數實際上有更多的參數,但你明白了。 – Flo

+0

你可以在.net 4.0中使用** ClientIDMode **設置來處理頁面如何顯示id,或者只是使用類似** 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頁面上的Web服務 ,該服務返回要保存在隱藏字段控件中的值。一旦Web服務 返回要存儲在隱藏字段中的值,完整功能就會根據成功 函數分配的布爾值在標籤中顯示 成功消息。這是我的例子。

$(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 

末級

相關問題