Sebuah fungsi yang sering digunakan, tetapi saya belum pernah menemukan solusi yang relevan di Internet. Hari ini, saya mengambil kesempatan aplikasi proyek untuk menulis dua metode untuk mengubah jalur absolut menjadi jalur virtual dan merangkumnya. Jalur tersebut diubah menjadi jalur virtual jalur relatif terhadap halaman yang ditentukan
/**//// <ringkasan>
/// Ubah jalur absolut di bawah situs web menjadi jalur virtual yang berhubungan dengan halaman yang ditentukan
/// </ringkasan>
/// <param name="page">Penunjuk halaman saat ini, biasanya ini</param>
/// <param name="specifiedPath">Jalur absolut</param>
/// <returns>Jalur virtual, ketik: ../../</returns>
string statis publik ConvertSpecifiedPathToRelativePathForPage(Halaman halaman, string yang ditentukanPath)
{
//Jalur virtual direktori root
string virtualPath = halaman.Request.ApplicationPath;
//Jalur absolut ke direktori root
string pathRooted = HostingEnvironment.MapPath(virtualPath);
//Jalur virtual halaman
string halamanVirtualPath = halaman.Permintaan.Path;
jika (!Path.IsPathRooted(specifiedPath) || ditentukanPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"adalah jalur virtual bukan jalur absolut!", ditentukanPath));
}
// Konversi ke jalur relatif
//(Pengujian menemukan bahwa pathRooted tampaknya berbeda ketika dijalankan di server yang dilengkapi dengan VS2005 dan di direktori root atau direktori virtual di bawah IIS.
// Beberapa tempat akan menambahkan "" setelahnya, beberapa tidak, buat penilaian saja untuk berjaga-jaga)
if (pathRooted.Substring(pathRooted.Panjang - 1, 1) == "\")
{
ditentukanPath = ditentukanPath.Replace(pathRooted, "/");
}
kalau tidak
{
ditentukanPath = ditentukanPath.Replace(pathRooted, "");
}
string relativePath = ditentukanPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// Kurangi halaman terakhir dan nilai "" sebelumnya
int pageNodesCount = pageNodes.Panjang - 2;
untuk (int i = 0; i < pageNodesCount; i++)
{
relativePath = "/.." + relativePath;
}
jika (halamanNodesCount > 0)
{
// Jika ".." ada, hapus awalan "/"
relativePath = relativePath.Substring(1, relativePath.Length - 1);
}
kembalikan jalur relatif;
}
Cara kedua ini jelas disarikan dari bagian pertama cara pertama, jadi saya terlalu malas untuk menambahkan komentar yang relevan :P
Ubah jalur absolut di bawah situs web menjadi jalur virtual
/**//// <ringkasan>
/// Ubah jalur absolut di bawah situs web menjadi jalur virtual
/// Catatan: Situs non-Web tidak akan dikonversi.
/// </ringkasan>
/// <param name="page">Penunjuk halaman saat ini, biasanya ini</param>
/// <param name="specifiedPath">Jalur absolut</param>
/// <returns>Jalur virtual, ketik: ~/</returns>
string statis publik ConvertSpecifiedPathToRelativePath(Halaman halaman, string yang ditentukanPath)
{
string virtualPath = halaman.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || ditentukanPath.IndexOf(pathRooted) == -1)
{
kembalikan Jalur yang ditentukan;
}
if (pathRooted.Substring(pathRooted.Panjang - 1, 1) == "\")
{
ditentukanPath = ditentukanPath.Replace(pathRooted, "~/");
}
kalau tidak
{
ditentukanPath = ditentukanPath.Replace(pathRooted, "~");
}
string relativePath = ditentukanPath.Replace("\", "/");
kembalikan relativePath;
}
Tidak ada yang perlu dikatakan tentang mengubah jalur virtual menjadi jalur absolut. Metode HttpRequest.MapPath dirancang khusus untuk melakukan hal ini.