وظيفة يتم استخدامها كثيرًا، لكنني لم أجد حلاً مناسبًا على الإنترنت. اليوم، انتهزت فرصة تطبيق المشروع لكتابة طريقتين لتحويل المسارات المطلقة إلى مسارات افتراضية وتغليفها المسار بالنسبة للصفحة المحددة
/**//// <الملخص>
/// تحويل المسار المطلق ضمن موقع الويب إلى مسار افتراضي متعلق بالصفحة المحددة
/// </الملخص>
/// <param name="page">مؤشر الصفحة الحالية، عادةً ما يكون هذا</param>
/// <param name="specifiedPath">المسار المطلق</param>
/// <returns>المسار الافتراضي، اكتب: ../../</returns>
سلسلة ثابتة عامة ConvertSpecifiedPathToRelativePathForPage (صفحة الصفحة، سلسلة المسار المحدد)
{
// المسار الظاهري للدليل الجذر
سلسلة VirtualPath = page.Request.ApplicationPath؛
// المسار المطلق إلى الدليل الجذر
مسار السلسلةRooted = HostingEnvironment.MapPath(virtualPath);
// المسار الظاهري للصفحة
سلسلة pageVirtualPath = page.Request.Path;
إذا (!Path.IsPathRooted(specifiedPath) || المحددPath.IndexOf(pathRooted) == -1)
{
رمي استثناء جديد (string.Format(""{0}"هو مسار افتراضي وليس مسارًا مطلقًا!"، المسار المحدد));
}
// تحويل إلى المسار النسبي
//(وجد الاختبار أن pathRooted يبدو مختلفًا عند التشغيل على الخادم الذي يأتي مع VS2005 وفي الدليل الجذر أو الدليل الظاهري ضمن IIS.
// ستضيف بعض الأماكن "" بعد ذلك، والبعض الآخر لن يفعل ذلك، فقط اتخذ قرارًا بأن تكون في الجانب الآمن)
إذا (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
المحدد المسار = المحددPath.Replace(pathRooted, "/");
}
آخر
{
المحدد المسار = المحددPath.Replace(pathRooted, "");
}
string نسبياPath = المحددPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// اطرح الصفحة الأخيرة والقيمة "" السابقة
int pageNodesCount = pageNodes.Length - 2
لـ (int i = 0; i <pageNodesCount; i++)
{
النسبي المسار = "/.." + المسار النسبي؛
}
إذا (pageNodesCount > 0)
{
// في حالة وجود ".."، قم بإزالة المسافة البادئة "/"
نسبيPath = نسبيPath.Substring(1, نسبيPath.Length - 1);
}
إرجاع المسار النسبي؛
}
من الواضح أن الطريقة الثانية مستخرجة من الجزء الأول من الطريقة الأولى، لذلك أنا كسول جدًا لإضافة التعليقات ذات الصلة :P
تحويل المسار المطلق ضمن موقع الويب إلى مسار افتراضي
/**//// <الملخص>
/// تحويل المسار المطلق ضمن الموقع إلى مسار افتراضي
/// ملاحظة: لن يتم تحويل تلك الموجودة ضمن مواقع غير الويب.
/// </الملخص>
/// <param name="page">مؤشر الصفحة الحالية، عادةً ما يكون هذا</param>
/// <param name="specifiedPath">المسار المطلق</param>
/// <returns> المسار الافتراضي، اكتب: ~/</returns>
سلسلة ثابتة عامة ConvertSpecifiedPathToRelativePath (صفحة الصفحة، سلسلة محددة المسار)
{
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath)
;
{
إرجاع المسار المحدد؛
}
إذا (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
المحدد المسار = المحددPath.Replace(pathRooted, "~/");
}
آخر
{
المحدد المسار = المحددPath.Replace(pathRooted, "~");
}
string نسبياPath = المحددPath.Replace("\", "/");
إرجاع المسار النسبي؛
}
ليس هناك ما يمكن قوله حول تحويل مسار ظاهري إلى مسار مطلق، وقد تم تصميم أسلوب HttpRequest.MapPath خصيصًا للقيام بذلك.