ฟังก์ชันที่ใช้บ่อย แต่ฉันไม่เคยพบวิธีแก้ปัญหาที่เกี่ยวข้องบนอินเทอร์เน็ตเลย วันนี้ ฉันใช้โอกาสในการสมัครโครงการเพื่อเขียนสองวิธีในการแปลงเส้นทางสัมบูรณ์เป็นเส้นทางเสมือนและห่อหุ้มเส้นทางเหล่านั้นเป็นเสมือน เส้นทางสัมพันธ์กับหน้าที่ระบุ
/***////// <สรุป>
/// แปลงเส้นทางสัมบูรณ์ภายใต้เว็บไซต์เป็นเส้นทางเสมือนที่สัมพันธ์กับเพจที่ระบุ
/// </สรุป>
/// <param name="page">ตัวชี้หน้าปัจจุบัน โดยปกติจะเป็น</param>
/// <param name="specifiedPath">เส้นทางสัมบูรณ์</param>
/// <returns>พาธเสมือน พิมพ์: ../../</returns>
สตริงสาธารณะคง ConvertSpecifiedPathToRelativePathForPage (หน้าเพจ สตริง specifiedPath)
-
// เส้นทางเสมือนของไดเรกทอรีราก
สตริง virtualPath = page.Request.ApplicationPath;
// เส้นทางสัมบูรณ์ไปยังไดเรกทอรีราก
string pathRooted = HostingEnvironment.MapPath (virtualPath);
//เพจเส้นทางเสมือน
string pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) || specifiedPath.IndexOf(pathRooted) == -1)
-
Throw new Exception(string.Format(""{0}"เป็นเส้นทางเสมือนไม่ใช่เส้นทางที่แน่นอน!", specifiedPath));
}
// แปลงเป็นเส้นทางสัมพัทธ์
//(การทดสอบพบว่า pathRooted ดูเหมือนจะแตกต่างออกไปเมื่อทำงานบนเซิร์ฟเวอร์ที่มาพร้อมกับ VS2005 และในไดเร็กทอรีรากหรือไดเร็กทอรีเสมือนภายใต้ IIS
// บางจุดจะเติม "" ตามหลัง บางที่จะไม่ใส่ แค่ตัดสินให้อยู่ในด้านความปลอดภัย)
ถ้า (pathRooted.Substring (pathRooted.Length - 1, 1) == "\")
-
specifiedPath = specifiedPath.Replace (pathRooted, "/");
-
อื่น
-
specifiedPath = specifiedPath.Replace (pathRooted, "");
}
stringrelativePath = specifiedPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// ลบหน้าสุดท้ายและค่า "" ก่อนหน้า
int pageNodesCount = pageNodes.Length - 2;
สำหรับ (int i = 0; i < pageNodesCount; i++)
-
RelativePath = "/.." + RelativePath;
}
ถ้า (pageNodesCount > 0)
-
// ถ้ามี ".." ให้ลบเครื่องหมาย "/" ที่นำหน้าออก
RelativePath = RelativePath.Substring (1, RelativePath.Length - 1);
}
ส่งคืน RelativePath;
}
เห็นได้ชัดว่าวิธีที่สองแยกมาจากส่วนแรกของวิธีแรก ดังนั้นฉันจึงขี้เกียจเกินไปที่จะเพิ่มความคิดเห็นที่เกี่ยวข้อง :P
แปลงเส้นทางสัมบูรณ์ใต้เว็บไซต์เป็นเส้นทางเสมือน
/***////// <สรุป>
/// แปลงเส้นทางสัมบูรณ์ใต้เว็บไซต์เป็นเส้นทางเสมือน
/// หมายเหตุ: ผู้ที่อยู่ภายใต้เว็บไซต์ที่ไม่ใช่เว็บไซต์จะไม่ถูกแปลง
/// </สรุป>
/// <param name="page">ตัวชี้หน้าปัจจุบัน โดยปกติจะเป็น</param>
/// <param name="specifiedPath">เส้นทางสัมบูรณ์</param>
/// <returns>พาธเสมือน พิมพ์: ~/</returns>
สตริงสาธารณะคง ConvertSpecifiedPathToRelativePath (หน้าเพจ สตริง specifiedPath)
-
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath);
ถ้า (!Path.IsPathRooted(specifiedPath) || specifiedPath.IndexOf(pathRooted) == -1)
-
กลับระบุเส้นทาง;
}
ถ้า (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
-
specifiedPath = specifiedPath.Replace (pathRooted, "~/");
-
อื่น
-
specifiedPath = specifiedPath.Replace (pathRooted, "~");
}
สตริงrelativePath = specifiedPath.Replace("\", "/");
กลับญาติ Path;
}
ไม่มีอะไรจะพูดเกี่ยวกับการแปลงเส้นทางเสมือนเป็นเส้นทางที่แน่นอน วิธี HttpRequest.MapPath ได้รับการออกแบบมาโดยเฉพาะเพื่อดำเนินการนี้