這兩天做項目的時候需要實現一個功能,就是點擊父頁面上的一個超鏈接或是控件,然后彈出一個新的子頁面。在子頁面中作出相應的操作,然后將子頁面的值傳遞到父頁面,效果圖如下:
根據網上的資料用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起跑線上的初學者們!同時也希望各位大牛能夠不吝賜教!給與我們小菜鳥們一些幫助!謝謝~