Dalam aplikasi saya, saya sering harus menggunakan jalur relatif. Misalnya, ketika saya mereferensikan JQuery, saya biasanya melakukannya seperti ini:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Sekarang saya melakukan transisi ke MVC, saya perlu memperhitungkan jalur berbeda yang mungkin dimiliki halaman, relatif terhadap root. Ini tentu saja merupakan masalah dengan penulisan ulang URL di masa lalu, tetapi saya berhasil mengatasinya dengan menggunakan jalur yang konsisten.
Saya sadar bahwa solusi standarnya adalah menggunakan jalur absolut seperti:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
tetapi ini tidak akan berfungsi untuk saya karena selama siklus pengembangan, saya harus menerapkan ke mesin uji tempat aplikasi akan berjalan dalam direktori virtual. Jalur relatif root tidak berfungsi saat root berubah. Juga, untuk alasan pemeliharaan, saya tidak bisa begitu saja mengubah semua jalur selama penerapan pengujian - itu akan menjadi mimpi buruk itu sendiri.
Jadi apa solusi terbaiknya?
Edit:
Karena pertanyaan ini masih menerima pandangan dan jawaban, saya pikir mungkin lebih bijaksana untuk memperbaruinya untuk dicatat bahwa pada Razor V2, dukungan untuk url root-relative sudah dimasukkan, sehingga Anda dapat menggunakan
<img src="~/Content/MyImage.jpg">
tanpa sintaks sisi server, dan mesin tampilan secara otomatis menggantikan ~ / dengan akar situs apa pun saat ini.
sumber
Sementara posting lama, pembaca baru harus tahu bahwa Razor 2 dan yang lebih baru (default di MVC4 +) sepenuhnya menyelesaikan masalah ini.
MVC3 lama dengan Razor 1:
MVC4 baru dengan Razor 2 dan lebih baru:
Tidak ada sintaks mirip fungsi Razor yang canggung. Tidak ada tag markup non-standar.
Mengawali jalur dalam atribut HTML apa pun dengan tilde ('~') memberi tahu Razor 2 untuk "membuatnya berfungsi" dengan mengganti jalur yang benar. Itu bagus.
sumber
Melanggar perubahan - MVC 5
Hati-hati dengan perubahan perubahan yang merusak di MVC 5 (dari catatan rilis MVC 5 )
Mereka sebenarnya tidak menjelaskan bagaimana melakukannya, tetapi kemudian saya menemukan jawaban ini :
Catatan: Anda mungkin ingin memeriksa
Request.ServerVariables
benar-benar berisiIIS_WasUrlRewritten
terlebih dahulu untuk memastikan ini adalah masalah Anda.PS. Saya pikir saya mengalami situasi di mana hal ini terjadi pada saya dan saya mendapatkan
src="~/content/..."
URL yang dibuat ke HTML saya - tetapi ternyata ada sesuatu yang tidak menyegarkan ketika kode saya sedang dikompilasi. Mengedit dan menyimpan kembali file Layout dan halaman cshtml entah bagaimana memicu sesuatu untuk bekerja.sumber
Di ASP.NET saya biasanya menggunakan
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Saya tidak melihat mengapa solusi serupa tidak berfungsi di ASP.NET MVC.sumber
Apa yang saya gunakan. Ubah jalur agar sesuai dengan contoh Anda.
sumber
Untuk apa nilainya, saya sangat membenci gagasan mengotori aplikasi saya dengan tag server hanya untuk menyelesaikan jalur, jadi saya melakukan sedikit lebih banyak penelitian dan memilih untuk menggunakan sesuatu yang telah saya coba sebelumnya untuk menulis ulang tautan - filter respons. Dengan cara ini, saya dapat mengawali semua jalur absolut dengan awalan yang diketahui dan menggantinya saat runtime menggunakan objek Response.Filter dan tidak perlu khawatir tentang tag server yang tidak perlu. Kode diposting di bawah seandainya itu akan membantu orang lain.
sumber
Mesin tampilan Razor untuk MVC 3 membuatnya lebih mudah dan lebih bersih untuk menggunakan jalur relatif root-virtual yang diselesaikan dengan benar pada waktu proses. Cukup jatuhkan metode Url.Content () ke dalam nilai atribut href dan itu akan diselesaikan dengan benar.
sumber
Seperti Chris, saya benar-benar tidak tahan harus meletakkan tag sisi server yang membengkak di dalam markup bersih saya hanya untuk memberi tahu hal bodoh untuk melihat dari akar ke atas. Permintaan itu seharusnya sangat sederhana dan masuk akal. Tetapi saya juga benci gagasan harus berusaha menulis kelas C # khusus untuk melakukan hal yang sesederhana itu, mengapa saya harus melakukannya? Buang-buang waktu.
Bagi saya, saya hanya berkompromi pada "kesempurnaan" dan melakukan hardcode nama jalur akar direktori virtual di dalam referensi jalur saya. Jadi seperti ini:
Tidak ada pemrosesan sisi server atau kode C # yang diperlukan untuk menyelesaikan URL, yang terbaik untuk kinerja meskipun saya tahu itu akan dapat diabaikan. Dan tidak ada kekacauan sisi server yang membengkak di markup bersih saya yang bagus.
Saya hanya harus hidup dengan mengetahui bahwa ini adalah hardcode dan perlu dihapus ketika sesuatu bermigrasi ke domain yang tepat, bukan http: // MyDevServer / MyProject /
Bersulang
sumber
Terlambat untuk permainan, tetapi posting ini memiliki ringkasan yang sangat lengkap tentang penanganan jalur ASP.Net.
sumber
Saya menggunakan metode pembantu sederhana. Anda dapat dengan mudah menggunakannya di Views dan Controllers.
Markup:
Metode pembantu:
sumber
Saya pergi dengan sedikit pendekatan yang berbeda berdasarkan posting SO yang serupa, tetapi dengan kode yang jauh lebih sedikit ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
sumber