Pertanyaan saya mirip dengan ini:
Kecuali saya ingin tetap menggunakan bundling MVC sendiri jika saya bisa. Saya mengalami crash otak mencoba mencari tahu apa pola yang benar untuk menentukan bundel gaya sehingga css mandiri dan set gambar seperti pekerjaan jQuery UI.
Saya memiliki struktur situs MVC khas /Content/css/
yang berisi CSS basis saya seperti styles.css
. Di dalam folder css itu saya juga memiliki subfolder seperti /jquery-ui
yang berisi file CSS plus /images
folder. Jalur gambar di jQuery UI CSS relatif terhadap folder itu dan saya tidak ingin mengacaukannya.
Seperti yang saya mengerti, ketika saya menentukan StyleBundle
saya perlu menentukan jalur virtual yang juga tidak cocok dengan jalur konten nyata, karena (dengan asumsi saya mengabaikan rute ke Konten) IIS kemudian akan mencoba untuk menyelesaikan jalur itu sebagai file fisik. Jadi saya menetapkan:
bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
.Include("~/Content/css/jquery-ui/*.css"));
dirender menggunakan:
@Styles.Render("~/Content/styles/jquery-ui")
Saya bisa melihat permintaan keluar ke:
http://localhost/MySite/Content/styles/jquery-ui?v=nL_6HPFtzoqrts9nwrtjq0VQFYnhMjY5EopXsK8cxmg1
Ini mengembalikan respons CSS yang benar dan diperkecil. Tetapi kemudian browser mengirimkan permintaan untuk gambar yang relatif terhubung sebagai:
http://localhost/MySite/Content/styles/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Yang merupakan 404
.
Saya mengerti bahwa bagian terakhir dari URL saya jquery-ui
adalah URL tanpa ekstensi, penangan untuk bundel saya, jadi saya bisa melihat mengapa permintaan relatif untuk gambar itu sederhana /styles/images/
.
Jadi pertanyaan saya adalah apa cara yang benar dalam menangani situasi ini?
sumber
Jawaban:
Menurut utas ini pada bundel MVC4 dan referensi gambar , jika Anda mendefinisikan bundel Anda sebagai:
Di mana Anda menentukan bundel di jalur yang sama dengan file sumber yang membentuk bundel, jalur gambar relatif masih akan berfungsi. Bagian terakhir dari jalur bundel sebenarnya adalah
file name
untuk bundel spesifik tersebut (yaitu,/bundle
bisa berupa nama apa pun yang Anda suka).Ini hanya akan berfungsi jika Anda menggabungkan CSS dari folder yang sama (yang menurut saya masuk akal dari perspektif bundling).
Memperbarui
Sesuai komentar di bawah ini oleh @ Hua Kung, atau ini sekarang dapat dicapai dengan menerapkan
CssRewriteUrlTransformation
( Ubah referensi URL relatif ke file CSS saat dibundel ).CATATAN: Saya belum mengonfirmasi komentar mengenai masalah penulisan ulang ke jalur absolut dalam direktori virtual, jadi ini mungkin tidak berfungsi untuk semua orang (?).
sumber
Solusi Grinn / ThePirat bekerja dengan baik.
Saya tidak suka bahwa itu baru metode Sertakan pada bundel, dan itu membuat file sementara di direktori konten. (mereka akhirnya diperiksa, dikerahkan, maka layanan tidak akan dimulai!)
Jadi untuk mengikuti desain Bundling, saya memilih untuk melakukan kode yang pada dasarnya sama, tetapi dalam implementasi IBundleTransform ::
Dan kemudian membungkusnya dalam Bundle Implemetation:
Penggunaan sampel:
Inilah metode ekstensi saya untuk RelativeFromAbsolutePath:
sumber
relativeToCSS
sebelum memanggilPath.GetFullPath()
.Lebih baik lagi (IMHO) menerapkan Bundel kustom yang memperbaiki jalur gambar. Saya menulis satu untuk aplikasi saya.
...
Untuk menggunakannya, lakukan:
...dari pada...
Apa yang dilakukannya adalah (ketika tidak dalam mode debug) mencari
url(<something>)
dan menggantinya denganurl(<absolute\path\to\something>)
. Saya menulisnya sekitar 10 detik yang lalu jadi mungkin perlu sedikit penyesuaian. Saya telah memperhitungkan URL dan data base64 yang sepenuhnya berkualifikasi dengan memastikan tidak ada titik dua (:) di jalur URL. Di lingkungan kami, gambar biasanya berada di folder yang sama dengan file css mereka, tetapi saya telah mengujinya dengan folder induk (url(../someFile.png)
) dan folder anak (url(someFolder/someFile.png
).sumber
Tidak perlu menentukan transformasi atau memiliki jalur subdirektori gila. Setelah banyak pemecahan masalah saya mengisolasinya ke aturan "sederhana" ini (apakah ini bug?) ...
Jika jalur bundel Anda tidak dimulai dengan root relatif dari item yang dimasukkan, maka root aplikasi web tidak akan diperhitungkan.
Kedengarannya seperti lebih banyak bug bagi saya, tapi toh itu cara Anda memperbaikinya dengan versi .NET 4.51 saat ini. Mungkin jawaban lain diperlukan pada ASP.NET build yang lebih lama, tidak dapat mengatakan tidak punya waktu untuk menguji semua itu secara retrospektif.
Untuk memperjelas, berikut adalah contohnya:
Saya punya file-file ini ...
Kemudian atur bundel seperti ...
Dan membuatnya seperti ...
Dan dapatkan "perilaku" (bug), file CSS itu sendiri memiliki root aplikasi (mis. "Http: // localhost: 1234 / MySite / Content / Site.css") tetapi gambar CSS dalam semua mulai "/ Konten / Gambar / ... "atau" / Gambar / ... "tergantung pada apakah saya menambahkan transformasi atau tidak.
Bahkan mencoba membuat folder "Bundel" untuk melihat apakah itu ada hubungannya dengan path yang ada atau tidak, tetapi itu tidak mengubah apa pun. Solusi untuk masalah ini adalah persyaratan bahwa nama bundel harus dimulai dengan path root.
Berarti contoh ini diperbaiki dengan mendaftarkan dan merender bundle path seperti ..
Jadi tentu saja Anda bisa mengatakan ini adalah RTFM, tetapi saya cukup yakin saya dan orang lain mengambil jalur "~ / Bundel / ..." ini dari templat default atau di suatu tempat dalam dokumentasi di situs web MSDN atau ASP.NET, atau hanya menemukan itu karena sebenarnya itu adalah nama yang cukup logis untuk jalur virtual dan masuk akal untuk memilih jalur virtual seperti itu yang tidak bertentangan dengan direktori nyata.
Bagaimanapun, begitulah adanya. Microsoft tidak melihat bug. Saya tidak setuju dengan ini, apakah itu harus berfungsi seperti yang diharapkan atau beberapa pengecualian harus dilemparkan, atau tambahan tambahan untuk menambahkan jalur bundel yang memilih untuk menyertakan root aplikasi atau tidak. Saya tidak bisa membayangkan mengapa ada orang yang tidak ingin root aplikasi dimasukkan ketika ada (biasanya kecuali Anda menginstal situs web Anda dengan alias DNS / root situs web default). Jadi sebenarnya itu yang seharusnya menjadi standar.
sumber
Saya menemukan bahwa CssRewriteUrlTransform gagal dijalankan jika Anda mereferensikan
*.css
file dan Anda memiliki*.min.css
file terkait di folder yang sama.Untuk memperbaikinya, hapus
*.min.css
file atau rujuk langsung dalam bundel Anda:Setelah itu, URL Anda akan ditransformasikan dengan benar dan gambar Anda harus diselesaikan dengan benar.
sumber
Mungkin saya bias, tapi saya cukup suka solusi saya karena tidak melakukan transformasi, dll regex dan memiliki jumlah kode paling sedikit :)
Ini berfungsi untuk situs yang dihosting sebagai Direktori Virtual di Situs Web IIS dan sebagai situs web root di IIS
Jadi saya membuat Implentasi dari
IItemTransform
enkapsulasiCssRewriteUrlTransform
dan digunakanVirtualPathUtility
untuk memperbaiki path dan memanggil kode yang ada:Tampaknya bekerja dengan baik untuk saya?
sumber
Meskipun jawaban Chris Baxter membantu dengan masalah asli, itu tidak berfungsi dalam kasus saya ketika aplikasi di-host di direktori virtual . Setelah menyelidiki opsi, saya selesai dengan solusi DIY.
ProperStyleBundle
kelas termasuk kode yang dipinjam dari aslinyaCssRewriteUrlTransform
untuk benar mengubah jalur relatif dalam direktori virtual. Itu juga melempar jika file tidak ada dan mencegah pemesanan ulang file dalam bundel (kode diambil dariBetterStyleBundle
).Gunakan seperti
StyleBundle
:sumber
Pada v1.1.0-alpha1 (paket pra rilis) kerangka kerja ini menggunakan
VirtualPathProvider
untuk mengakses file daripada menyentuh sistem file fisik.Transformator yang diperbarui dapat dilihat di bawah:
sumber
Berikut adalah Bundel Transform yang akan mengganti url css dengan url relatif terhadap file css. Cukup tambahkan ke bundel Anda dan itu akan memperbaiki masalah.
sumber
cannot convert type from BundleFile to FileInfo
Pilihan lain adalah menggunakan modul Penulisan Ulang URL IIS untuk memetakan folder gambar bundel virtual ke folder gambar fisik. Di bawah ini adalah contoh aturan penulisan ulang yang dapat Anda gunakan untuk bundel yang disebut "~ / bundel / halaman Anda / gaya" - perhatikan pencocokan regex pada karakter alfanumerik serta tanda hubung, garis bawah dan periode, yang umum dalam nama file gambar .
Pendekatan ini menciptakan sedikit overhead tambahan, tetapi memungkinkan Anda untuk memiliki kontrol lebih besar atas nama bundel Anda, dan juga mengurangi jumlah bundel yang mungkin harus Anda rujuk pada satu halaman. Tentu saja, jika Anda harus mereferensi banyak file css pihak ke-3 yang berisi referensi path gambar relatif, Anda masih tidak bisa membuat banyak bundel.
sumber
Solusi Grinn sangat bagus.
Namun itu tidak berfungsi untuk saya ketika ada referensi relatif folder induk di url. yaitu
url('../../images/car.png')
Jadi, saya sedikit mengubah
Include
metode untuk menyelesaikan jalur untuk setiap pertandingan regex, memungkinkan jalur relatif dan juga secara opsional menanamkan gambar dalam css.Saya juga mengubah IF DEBUG untuk memeriksa
BundleTable.EnableOptimizations
bukanHttpContext.Current.IsDebuggingEnabled
.Semoga ini bisa membantu, salam.
sumber
Anda bisa menambahkan level kedalaman lain ke jalur bundel virtual Anda
Ini adalah jawaban yang sangat berteknologi rendah dan jenis peretasan tetapi berhasil dan tidak memerlukan pra-pemrosesan. Mengingat panjang dan rumitnya beberapa jawaban ini saya lebih suka melakukannya dengan cara ini.
sumber
Saya punya masalah dengan bundel yang memiliki jalur yang salah ke gambar dan
CssRewriteUrlTransform
tidak menyelesaikan jalur induk relatif..
dengan benar (ada juga masalah dengan sumber daya eksternal seperti webfonts). Itulah sebabnya saya menulis transformasi ubahsuaian ini (tampaknya melakukan semua hal di atas dengan benar):Sunting: Saya tidak menyadarinya, tetapi saya menggunakan beberapa metode ekstensi khusus dalam kode. Kode sumbernya adalah:
Tentu saja itu harus mungkin untuk menggantikan
String.StartsWith(char)
denganString.StartsWith(string)
.sumber
m.Groups[2].Value.Count("..")
tidak berfungsi.) DanValue.StartsWith('/')
tidak berfungsi karena StartsWith mengharapkan string, bukan char.Setelah sedikit penyelidikan saya menyimpulkan yang berikut: Anda memiliki 2 pilihan:
pergi dengan transformasi. Paket yang sangat berguna untuk ini: https://bundletransformer.codeplex.com/ Anda perlu transformasi berikut untuk setiap bundel yang bermasalah:
Keuntungan: dari solusi ini, Anda dapat memberi nama bundel Anda apa pun yang Anda inginkan => Anda dapat menggabungkan file css menjadi satu bundel dari direktori yang berbeda. Kekurangan: Anda perlu mengubah setiap bundel yang bermasalah
sumber
CssRewriteUrlTransform
memperbaiki masalah saya.Jika kode Anda masih tidak memuat gambar setelah menggunakan
CssRewriteUrlTransform
, maka ubah nama file css Anda dari:Untuk:
Someway. (Titik) tidak mengenali di url.
sumber
Ingatlah untuk memperbaiki beberapa inklusi CSS dalam satu bundel seperti:
Anda tidak bisa hanya menambahkan
new CssRewriteUrlTransform()
sampai akhir seperti yang Anda bisa dengan satu file CSS karena metode ini tidak mendukungnya, jadi Anda harus menggunakanInclude
beberapa kali :sumber