Response.Redirect باستخدام ~ المسار
-
09-06-2019 - |
سؤال
لدي طريقة أريد من خلالها إعادة توجيه المستخدم مرة أخرى إلى صفحة تسجيل الدخول الموجودة في جذر تطبيق الويب الخاص بي.
أنا أستخدم الكود التالي:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
هذا لا يعمل رغم ذلك.كان افتراضي أن ASP.NET سيحل عنوان URL تلقائيًا إلى المسار الصحيح.عادة، وأود أن مجرد استخدام
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
لكن هذا الرمز موجود على صفحة رئيسية، ويمكن تنفيذه من أي مستوى مجلد.كيف يمكنني التغلب على هذه المشكلة؟
المحلول
أعتقد أنك بحاجة إلى إسقاط "~/" واستبدالها بـ "/" فقط، وأعتقد أن / هو الجذر
توقف هناك! :-) إلا إذا كنت تريد ترميز تطبيق الويب الخاص بك بحيث لا يمكن تثبيته إلا على جذر موقع الويب.
"~/" يكون الشيء الصحيح الذي يجب استخدامه، ولكن السبب وراء عدم عمل الكود الأصلي كما هو متوقع هو ذلك ResolveUrl
(والذي يستخدم داخليا من قبل Redirect
) يحاول أولاً معرفة ما إذا كان المسار الذي تمرره هو عنوان URL مطلق (على سبيل المثال"**http://الخادم/**foo/bar.htm" بدلاً من "foo/bar.htm") - ولكن للأسف يقوم بذلك ببساطة عن طريق البحث عن حرف النقطتين ':' في عنوان URL الذي تقدمه له.ولكن في هذه الحالة، يتم العثور على نقطتين في عنوان URL الذي تقدمه في ملف ReturnPath
قيمة سلسلة الاستعلام، والتي تخدعها - لذلك لم يتم حل '~/' الخاصة بك.
الحل هو أنه يجب عليك ترميز عنوان URL لملف ReturnPath
القيمة التي تفلت من المشكلة ':' بالإضافة إلى أي أحرف خاصة أخرى.
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));
بالإضافة إلى ذلك، أوصي بعدم استخدامك (أو أي شخص) أبدًا Uri.ToString
- لأنه يوفر نسخة سهلة القراءة وأكثر "ملاءمة" لعنوان URL - وليست نسخة صحيحة بالضرورة (فهي لا تفلت من الأشياء).بدلاً من ذلك استخدم Uri.AbsoluteUri - هكذا:
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
نصائح أخرى
يمكنك حل عنوان URL First Response.redirect ("~/login.aspx) ؛وإضافة المعلمات بعد حلها.
ماذا عن استخدام
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));