今天在asp.net mvc網站項目的前台頁面里寫一段js代碼時,想要跳轉到某個url,例如
location.href="xxxx?"+"id="+id+"&keyword="+keyword;
其中id和keyword都是后台Controller的Action方法需要的參數,從html的input文本框的值,奇怪的是當在keyword文本框輸入"#1作品"時,發現傳到后台時keyword的值為null,前端明明傳的是"#1作品",怎么到了后台成了null?
另外一類似的方法中,用JQuery的ajax發送post請求時,也向后台發送了參數id="#1作品",后台卻能正確接收到"#1作品"。
上網查了才知道,當url中出現"#"號時,"#"及其后面的字符串都會被忽略,不會被發送到服務器,因為瀏覽器將一個url視為一個html頁面,而"#str"表示該頁面的id為str的塊(section),如<div id="str">......</div>,請求被發送到服務器,然后服務器把頁面發送到瀏覽器,並被瀏覽器解析之后,瀏覽器在將該頁面自動滾動到id為str的section。
因為請求的是頁面,所以瀏覽器不會把"#"后面的當成參數發送到服務器,因此服務器收到的該參數值為null.
但是服務器又需要這個參數,怎么辦呢,答案是對參數進行轉義就行了,利用js的escape()函數即可轉義:
location.href="xxxx?"+"id="+id+"&keyword="+escape(keyword);
這樣"#"會被轉義成"%23",而后台的cs代碼會自動將其恢復成轉義之前的"#"。
而用JQuery發送post類型的ajax請求時,因為參數被封裝進數據體,並沒有放在url中,因此不需要轉義也會原原本本地發送給服務器,轉義之后反而得不到"#"了,而是變成了"%23"。