Motivasi utama saya untuk mencoba melakukan ini adalah untuk mendapatkan Javascript yang hanya diperlukan oleh sebagian di bagian bawah halaman dengan Javascript lainnya dan bukan di tengah halaman tempat sebagian dirender.
Berikut adalah contoh sederhana dari apa yang saya coba lakukan:
Berikut adalah tata letak dengan bagian Skrip tepat di depan badan.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Berikut adalah contoh tampilan yang menggunakan tata letak ini.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
Dan inilah sebagian yang dirender dari tampilan.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
Dalam contoh ini, markup yang ditentukan dalam tampilan ditempatkan ke dalam bagian, tetapi markup dari parsial tidak. Apakah mungkin untuk mengisi bagian dari pandangan parsial dengan Razor? Jika tidak, apa sajakah metode lain untuk mendapatkan Javascript yang hanya dibutuhkan sebagian di bagian bawah halaman tanpa menyertakannya secara global?
sumber
Jawaban:
Cara saya menangani ini adalah dengan menulis beberapa metode ekstensi ke kelas HtmlHelper. Itu memungkinkan tampilan parsial untuk mengatakan bahwa mereka memerlukan skrip, lalu dalam tampilan tata letak yang menulis tag yang saya panggil ke metode pembantu saya untuk mengeluarkan skrip yang diperlukan
Berikut adalah metode helper:
Setelah Anda menerapkannya, tampilan parsial Anda hanya perlu dipanggil
@Html.RequireScript("/Path/To/Script")
.Dan di bagian kepala tampilan tata letak yang Anda panggil
@Html.EmitRequiredScripts()
.Bonus tambahan dari ini adalah memungkinkan Anda untuk menyingkirkan permintaan skrip duplikat. Jika Anda memiliki beberapa tampilan / sebagian tampilan yang membutuhkan skrip tertentu, Anda dapat dengan aman berasumsi bahwa Anda hanya akan mengeluarkannya sekali
sumber
Tampilan parsial tidak dapat berpartisipasi di bagian tampilan induknya.
sumber
Anda bisa memiliki bagian kedua yang hanya bertugas menyuntikkan javascript yang diperlukan. Tempatkan beberapa skrip di sana di sekitar
@if
blok, jika Anda mau:Ini jelas bisa dibersihkan sedikit, tetapi kemudian, di
Scripts
bagian tampilan Anda:Sekali lagi, itu mungkin tidak memenangkan hadiah kecantikan tetapi itu akan berhasil.
sumber
Cara yang lebih elegan untuk melakukannya adalah dengan memindahkan skrip tampilan parsial ke dalam file terpisah dan kemudian merendernya di bagian tampilan Skrip:
Tampilan parsial _ Partial.cshtml :
Tampilan parsial _ PartialScripts.cshtml hanya dengan skrip:
sumber
Instal paket nuget Forloop.HtmlHelpers - ini menambahkan beberapa pembantu untuk mengelola skrip dalam tampilan parsial dan template editor.
Di suatu tempat di tata letak Anda, Anda perlu menelepon
Ini akan menjadi tempat file skrip dan blok skrip akan dikeluarkan di halaman jadi saya akan merekomendasikan meletakkannya setelah skrip utama Anda dalam tata letak dan setelah bagian skrip (jika Anda memilikinya).
Jika Anda menggunakan The Web Optimization Framework dengan bundling, Anda dapat menggunakan kelebihan beban
Sehingga metode ini digunakan untuk menulis file script.
Sekarang, kapan pun Anda ingin menambahkan file atau blok skrip dalam tampilan, tampilan parsial, atau templat, cukup gunakan
Para pembantu memastikan bahwa hanya satu referensi file skrip yang dirender jika ditambahkan beberapa kali dan itu juga memastikan bahwa file skrip dirender dalam urutan yang diharapkan, yaitu
sumber
[Versi terbaru] Versi yang diperbarui mengikuti pertanyaan @Necrocubus untuk menyertakan skrip sebaris.
2 sen saya, ini adalah posting lama, tetapi masih relevan, jadi berikut adalah pembaruan yang ditingkatkan dari solusi Tuan Bell yang bekerja dengan ASP.Net Core.
Ini memungkinkan menambahkan skrip dan gaya ke tata letak utama dari tampilan parsial dan subview yang diimpor, dan kemungkinan untuk menambahkan opsi ke impor skrip / gaya (seperti async defer dll):
sumber
<text>
, cukup tambahkan sebagai string (Anda masih bisa mengawali dengan @ "" untuk multi baris jika Anda mau), dan tanpa<script>
tagAnda dapat membuat
Layout
halaman baru dan membungkus PartialView di dalam Tampilan Penuh yang bertanggung jawab untuk merender konten dan juga bagian pustaka apa pun.Misalnya, saya memiliki kode berikut:
HomeController.cs
Saat tampilan Halaman Penuh dirender, biasanya ditampilkan dengan menggabungkan dua file:
About.cshtml
_Layout.cshtml
(atau apa pun yang ditentukan di _ViewStart atau diganti di halaman)Sekarang , misalkan Anda ingin Render
About.cshtml
as a Partial View , mungkin sebagai jendela modal dalam menanggapi panggilan AJAX. Tujuannya di sini adalah untuk mengembalikan hanya konten yang ditentukan di halaman tentang, skrip, dan semua, tanpa semua penggembungan yang disertakan dalam_Layout.cshtml
tata letak master (seperti<html>
dokumen ).Anda dapat mencobanya seperti ini, tetapi itu tidak akan datang dengan salah satu blok bagian:
Sebagai gantinya, tambahkan halaman tata letak yang lebih sederhana seperti ini:
_PartialLayout.cshtml
Atau untuk mendukung jendela modal seperti ini:
_ModalLayout.cshtml
Kemudian Anda dapat menentukan Tampilan Master kustom di pengontrol ini atau penangan lain yang Anda inginkan untuk merender konten dan skrip tampilan secara bersamaan
sumber
Bagi mereka yang mencari versi aspnet core 2.0:
Tambahkan ke tata letak Anda setelah skrip membuat panggilan bagian:
Dan dalam pandangan parsial Anda:
sumber
Berdasarkan jawaban dari Mr Bell And Shimmy di atas, saya menambahkan fungsi ekstra untuk skrip Bundle.
Contoh di PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Contoh di MasterPage: - @ Html.EmitRequiredBundleStyles ()
sumber
Gunakan
@using(Html.Delayed()){ ...your content... }
ekstensi dari answer https://stackoverflow.com/a/18790222/1037948 untuk merender konten apa pun (skrip atau hanya HTML) nanti di laman. InternalQueue
harus memastikan pemesanan yang benar.sumber
Fungsionalitas ini juga diimplementasikan di ClientDependency.Core.Mvc.dll. Ini menyediakan pembantu html: @ Html.RequiresJs dan @ Html.RenderJsHere (). Paket Nuget: ClientDependency-Mvc
sumber
Berikut solusi saya untuk pertanyaan yang sering diajukan "bagaimana menyuntikkan bagian dari tampilan parsial ke tampilan utama atau tampilan tata letak utama untuk asp.net MVC?". Jika Anda melakukan pencarian di stackoverflow dengan kata kunci "bagian + parsial", Anda akan mendapatkan daftar pertanyaan terkait yang cukup besar, dan jawaban yang diberikan, tetapi tidak ada satupun yang tampak elegan bagi saya melalui tata bahasa mesin silet. Jadi saya hanya melihat ke mesin Razor untuk melihat apakah mungkin ada solusi yang lebih baik untuk pertanyaan ini.
Untungnya, saya menemukan sesuatu yang menarik bagi saya tentang bagaimana mesin Razor melakukan kompilasi untuk file template tampilan (* .cshtml, * .vbhtml). (Saya akan jelaskan nanti), di bawah ini adalah kode solusi saya yang menurut saya cukup sederhana dan cukup elegan dalam penggunaan.
pemakaian : Untuk menggunakan kodenya juga cukup sederhana, dan tampilannya hampir sama gaya biasanya. Ini juga mendukung setiap level ke tampilan parsial bersarang. yaitu. Saya memiliki rantai template tampilan: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
Di layout.cshtml, kami memiliki:
Dan di index.cshtml, kami memiliki:
Dan di head.cshtml, kita akan memiliki kode:
itu sama di foot.cshtml atau ad.cshtml, Anda masih dapat menentukan bagian Head atau Foot di dalamnya, pastikan untuk memanggil @ Html.EnsureSection () sekali di akhir file tampilan parsial. Hanya itu yang perlu Anda lakukan untuk menyingkirkan masalah yang dibahas di asp mvc.
Saya hanya membagikan cuplikan kode saya sehingga orang lain dapat menggunakannya. Jika Anda merasa itu bermanfaat, jangan ragu untuk meningkatkan peringkat posting saya. :)
sumber