關於父子頁面的交互


 

  這兩天做項目的時候需要實現一個功能,就是點擊父頁面上的一個超鏈接或是控件,然后彈出一個新的子頁面。在子頁面中作出相應的操作,然后將子頁面的值傳遞到父頁面,效果圖如下:

根據網上的資料用js幾句話就可以搞定,可是自己做起來之后發現卻沒那么簡單,網上的說法是當點擊這個超鏈接(此處為文本框)時觸發一個事件, window.showModalDialog("要跳轉的頁面");我剛開始就遇到麻煩了,不知怎么得不能獲取文本框,后來發現原來自己暈了,忘了我的網站套用模板了。當網站套用模板時,用JQuery獲取這個文本框就不能簡單的$("#id")了,因為這樣的話容易和模板頁里面的控件混淆(個人理解),需要怎么辦呢? $("#<%=id.ClientID%>"),必須指出是ClientID。這樣就搞定了。一個小插曲,好,回來!這樣的話,就可以觸發事件將新頁面展示出來了。代碼如下: $(function () {
            $("#<%=Id.ClientID%>").click(function () {
                $(this).val("");
                window.showModalDialog("新頁面的路徑");
            });
        })

這樣新的頁面就展示出來了,如果單純的在新的頁面中傳值的話直接一個 window.returnValue = 要傳遞的值,然后再父頁面中獲取 window.showModalDialog("新頁面的路徑");的返回值就可以了,但是有很多時候在子頁面中往往沒那么簡單,往往是通過一系列的選擇,以及后台代碼的處理來得到這個值,然后再傳遞給父頁面。一旦涉及到后台代碼的話,后台代碼與js結合就比較麻煩了。

  比如上面的這個例子,它的目的是通過選擇樹節點,然后將節點的名稱以及ID傳遞給父頁面,但是上面這個樹控件不是.net自帶的TreeView控件,是用戶自定義的。並且通過js只能獲得選中節點的ID,如果想獲得節點的名稱的話,必須在后台通過C#代碼獲得。

  那這樣通過ajax去訪問后台的方法

 function delData(pid) {                // 訪問頁面后台方法            

         var loc = window.location.href;

            $.ajax({                 type: "POST",                 url: (loc + "/方法的名稱").replace("#", ""),

                data: '{ pid: "' + pid + '"}',                    // 發送信息至服務器時內容編碼類型              

                  contentType: "application/json; charset=utf-8",           

      dataType: "text",        

         success: function (msg) {                     // AJAX響應被包裝到一個d對象里,如{"d":true},               

  //msg為返回值,返回的是選中節點的名稱

  }                 },            

     error: function (xhr, textStatus, errorThrown) { alert("AJAX錯誤:" + errorThrown); }             });         }

  但是這樣的話,訪問的方法只能是靜態的方法。而我的數據源偏偏不是靜態的,這樣的話這個方法基本上告吹了!那接下來只能在后台代碼中拼寫JS代碼了。

方法一:Response.Write("<script>window.returnValue= '" + id +"|"+name+ "';window.close();</script>");這樣直接在父頁面中接收這個returnValue然后根據|將返回值分開,可以獲取id和name了。但是不知為什么,在我的項目中父頁面就是獲取不到這個值,我懷疑是我使用了模板頁的原因,希望大牛們可以給我指點。這樣我只能使用第二種方法了,

方法二: Response.Write("<script lang='javascript'>window.opener.document.all.ctl00$ContentPlaceHolder1$id.value='"+name+"';window.close();</script>");

就是在子頁面里面直接操作父頁面,通過這個方法直接給父頁面的控件賦值,這樣就完成了。

  完成父子頁面的交互后,從子頁面傳遞name然后將它賦給父頁面的TextBox,但是TextBox是可編輯的。這樣就很不爽了,就想能不能把它設為readonly,不能去編輯。但是設為readonly之后又出問題了,在后台獲取的文本框的值為空,也不知微軟為什么做,后來通過網上查資料找到了解決辦法,剛開始不要設置文本框為空,在頁面初始化的時候再通過代碼設置為空就可以了。具體代碼如下:  protected void Page_Load(object sender, EventArgs e)
        {

 if (!Page.IsPostBack)
            {
                文本框ID.Attributes.Add("readonly", "true");

}

}

這樣的話基本完成了!

  我曉得,我寫的這些東西很多大牛在很早之前就已經搞定了,可能這就是一些小兒科的東西,但我還是要寫出來,不為別的,我是今年剛畢業的小菜鳥,我在做這個功能的時候費了不少力,我希望我所分享的這點知識能夠幫助和我一樣掙扎在IT起跑線上的初學者們!同時也希望各位大牛能夠不吝賜教!給與我們小菜鳥們一些幫助!謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM