ฉันรู้ว่าในฝั่งไคลเอนต์ (javascript) คุณสามารถใช้ windows.location.hash ได้ แต่ไม่พบการเข้าถึงจากฝั่งเซิร์ฟเวอร์
ฉันรู้ว่าในฝั่งไคลเอนต์ (javascript) คุณสามารถใช้ windows.location.hash ได้ แต่ไม่พบการเข้าถึงจากฝั่งเซิร์ฟเวอร์
คำตอบ:
เรามีสถานการณ์ที่เราจำเป็นต้องคงแฮช URL ไว้ใน ASP.Net หลังการโพสต์ เนื่องจากเบราว์เซอร์ไม่ส่งแฮชไปยังเซิร์ฟเวอร์โดยค่าเริ่มต้นวิธีเดียวที่จะทำได้คือใช้ Javascript บางตัว:
เมื่อส่งแบบฟอร์มแล้วให้จับแฮช ( window.location.hash
) และเก็บไว้ในฟิลด์อินพุตที่ซ่อนอยู่ฝั่งเซิร์ฟเวอร์ใส่สิ่งนี้ใน DIV โดยมี id เป็น " urlhash
" เพื่อให้เราสามารถค้นหาได้ง่ายในภายหลัง
บนเซิร์ฟเวอร์คุณสามารถใช้ค่านี้ได้หากคุณต้องการทำอะไรบางอย่างกับมัน คุณยังสามารถเปลี่ยนได้หากต้องการ
ในการโหลดหน้าบนไคลเอนต์ให้ตรวจสอบค่าของฟิลด์ที่ซ่อนอยู่นี้ คุณจะต้องค้นหาโดย DIV ที่มีอยู่เนื่องจากจะไม่ทราบรหัสที่สร้างขึ้นโดยอัตโนมัติ ใช่คุณสามารถใช้กลอุบายบางอย่างได้ที่นี่ด้วย. ClientID แต่เราพบว่ามันง่ายกว่าแค่ใช้ wrapper DIV เนื่องจากอนุญาตให้ Javascript ทั้งหมดนี้อยู่ในไฟล์ภายนอกและใช้ในรูปแบบทั่วไป
หากช่องป้อนข้อมูลที่ซ่อนอยู่มีค่าที่ถูกต้องให้ตั้งค่านั้นเป็นแฮช URL ( window.location.hash again
) และ / หรือดำเนินการอื่น ๆ
เราใช้ jQuery เพื่อลดความซับซ้อนในการเลือกฟิลด์ ฯลฯ ... สรุปแล้วเป็นการเรียก jQuery สองสามครั้งหนึ่งเพื่อบันทึกค่าและอีกอันเพื่อเรียกคืน
ก่อนส่ง:
$("form").submit(function() {
$("input", "#urlhash").val(window.location.hash);
});
ในการโหลดหน้า:
var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
window.location.hash = hashVal;
}
IsHashValid()
สามารถตรวจสอบ " undefined
" หรือสิ่งอื่น ๆ ที่คุณไม่ต้องการจัดการ
ตรวจสอบให้แน่ใจว่าคุณใช้$(document).ready()
อย่างเหมาะสมแน่นอน
RFC 2396ส่วน 4.1:
เมื่อใช้การอ้างอิง URI เพื่อดำเนินการดึงข้อมูลบนรีซอร์สที่ระบุตัวระบุแฟรกเมนต์ที่เป็นทางเลือกซึ่งแยกออกจาก URI ด้วยอักขระ crosshatch ("#") ประกอบด้วยข้อมูลอ้างอิงเพิ่มเติมที่ตัวแทนผู้ใช้จะตีความหลังจากการดึงข้อมูล การดำเนินการเสร็จสมบูรณ์แล้ว ดังนั้นจึงไม่ได้เป็นส่วนหนึ่งของ URI แต่มักใช้ร่วมกับ URI
(เน้นเพิ่ม)
นั่นเป็นเพราะเบราว์เซอร์ไม่ส่งส่วนนั้นไปยังเซิร์ฟเวอร์ขออภัย
อาจเป็นทางเลือกเดียวคืออ่านในฝั่งไคลเอ็นต์และโอนไปยังเซิร์ฟเวอร์ด้วยตนเอง (GET / POST / AJAX) ขอแสดงความนับถือ Artur
คุณอาจเห็นวิธีการเล่นด้วยปุ่มย้อนกลับและประวัติเบราว์เซอร์ ที่ Malcan
เพียงเพื่อแยกแยะความเป็นไปได้ที่คุณไม่ได้พยายามดูแฟรกเมนต์บน GET / POST และต้องการทราบวิธีเข้าถึงส่วนนั้นของอ็อบเจ็กต์ URI ที่คุณมีภายในโค้ดฝั่งเซิร์ฟเวอร์ซึ่งอยู่ภายใต้ Uri ( เอกสาร MSDN )
วิธีแก้ปัญหาที่เป็นไปได้สำหรับคำขอ GET:
รูปแบบลิงค์ใหม่: http://example.com/yourDirectory?hash=video01
เรียกใช้ฟังก์ชันนี้ที่ด้านบนของตัวควบคุมหรือhttp://example.com/yourDirectory/index.php
:
function redirect()
{
if (!empty($_GET['hash'])) {
/** Sanitize & Validate $_GET['hash']
If valid return string
If invalid: return empty or false
******************************************************/
$validHash = sanitizeAndValidateHashFunction($_GET['hash']);
if (!empty($validHash)) {
$url = './#' . $validHash;
} else {
$url = '/your404page.php';
}
header("Location: $url");
}
}