Saya memiliki bagian ini didefinisikan di blog saya _Layout.cshtml
@RenderSection("Scripts", false)
Saya dapat dengan mudah menggunakannya dari tampilan:
@section Scripts {
@*Stuff comes here*@
}
Yang saya perjuangkan adalah bagaimana cara agar beberapa konten disuntikkan di dalam bagian ini dari tampilan sebagian.
Mari kita asumsikan ini adalah halaman tampilan saya:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Saya perlu menyuntikkan beberapa konten di dalam Scripts
bagian dari _myPartial
tampilan sebagian.
Bagaimana saya bisa melakukan ini?
Jawaban:
Bagian tidak berfungsi dalam tampilan sebagian dan itu berdasarkan desain. Anda dapat menggunakan beberapa pembantu kustom untuk mencapai perilaku yang serupa, tetapi jujur itu tanggung jawab pandangan untuk menyertakan skrip yang diperlukan, bukan tanggung jawab parsial. Saya akan merekomendasikan menggunakan bagian @script dari tampilan utama untuk melakukan itu dan tidak perlu khawatir tentang skrip.
sumber
Ini pertanyaan yang cukup populer, jadi saya akan posting solusi saya.
Saya memiliki masalah yang sama dan meskipun tidak ideal, saya pikir itu benar-benar berfungsi dengan baik dan tidak membuat sebagian bergantung pada pandangan.
Skenario saya adalah bahwa suatu tindakan dapat diakses dengan sendirinya tetapi juga dapat disematkan ke tampilan - peta google.
Di saya,
_layout
saya punya:Dalam
index
pandangan saya, saya memiliki:Dalam
clients
pandangan saya, saya punya (semua peta dan asosiasi html):Saya
Clients_Scripts
Tampilan berisi javascript yang akan ditampilkan ke halamanDengan cara ini skrip saya diisolasi dan dapat dirender ke dalam halaman di mana diperlukan, dengan
body_scripts
tag hanya diberikan pada kejadian pertama yang ditemukan oleh mesin tampilan silet.Itu membuat saya memiliki segalanya yang terpisah - ini adalah solusi yang bekerja cukup baik bagi saya, orang lain mungkin memiliki masalah dengan itu, tetapi itu menambal lubang "dengan desain".
sumber
Dari solusi di utas ini , saya datang dengan solusi yang mungkin rumit berikut ini yang memungkinkan Anda menunda rendering html (skrip juga) dalam blok menggunakan.
PEMAKAIAN
Buat "bagian"
Skenario umum: Dalam tampilan parsial, hanya sertakan blok satu kali tidak peduli berapa kali tampilan parsial diulang dalam halaman:
Dalam tampilan parsial, sertakan blok untuk setiap kali parsial digunakan:
Dalam tampilan parsial, hanya sertakan blok sekali tidak peduli berapa kali parsial diulang, tetapi kemudian render secara khusus dengan nama
when-i-call-you
:Render "bagian"
(yaitu menampilkan bagian yang tertunda dalam tampilan induk)
KODE
sumber
isOnlyOne
, tetapi hanya jika Anda ingin merendernya di lokasi tertentu dengan nama yang Anda berikan pengidentifikasi, kalau tidak akan dibuang diHtml.RenderDelayed()
.Saya punya masalah ini dan menggunakan teknik ini .
Ini solusi terbaik yang saya temukan yang sangat fleksibel.
Juga silahkan memilih di sini untuk menambahkan dukungan untuk kumulatif bagian deklarasi
sumber
Jika Anda memiliki kebutuhan yang sah untuk menjalankan beberapa
js
daripartial
, inilah cara Anda dapat melakukannya,jQuery
diperlukan:sumber
Mengikuti prinsip yang tidak mencolok , itu tidak cukup diperlukan untuk "_myPartial" untuk menyuntikkan konten langsung ke bagian skrip. Anda dapat menambahkan skrip tampilan parsial tersebut ke
.js
file terpisah dan merujuknya ke bagian skrip @ dari tampilan induk.sumber
Ada kesalahan mendasar dalam cara kita berpikir tentang web, terutama ketika menggunakan MVC. Kekurangannya adalah bahwa JavaScript merupakan tanggung jawab pandangan. Tampilan adalah tampilan, JavaScript (perilaku atau sebaliknya) adalah JavaScript. Dalam pola MVVM Silverlight dan WPF, kita dihadapkan dengan "lihat dulu" atau "model dulu". Dalam MVC kita harus selalu mencoba memberi alasan dari sudut pandang model dan JavaScript adalah bagian dari model ini dalam banyak hal.
Saya akan menyarankan menggunakan pola AMD (saya sendiri suka RequireJS ). Pisahkan JavaScript Anda dalam modul, tentukan fungsionalitas Anda dan kaitkan ke html Anda dari JavaScript alih-alih mengandalkan tampilan untuk memuat JavaScript. Ini akan membersihkan kode Anda, memisahkan masalah Anda dan membuat hidup lebih mudah dalam satu gerakan.
sumber
window
objek, dan menyertakan skrip perpustakaan sebelum parsial.Tujuan OP adalah bahwa ia ingin mendefinisikan skrip inline ke dalam Partial View-nya, yang saya asumsikan bahwa skrip ini hanya khusus untuk Partial View itu, dan memasukkan blok tersebut ke dalam bagian skripnya.
Saya mengerti bahwa dia ingin agar Pandangan Parsial itu menjadi mandiri. Idenya mirip dengan komponen ketika menggunakan Angular.
Cara saya adalah hanya menyimpan skrip di dalam Partial View apa adanya. Sekarang masalah dengan itu adalah saat memanggil Tampilan Parsial, mungkin mengeksekusi skrip di sana sebelum semua skrip lainnya (yang biasanya ditambahkan ke bagian bawah halaman tata letak). Dalam hal ini, Anda hanya perlu skrip Partial View menunggu skrip lain. Ada beberapa cara untuk melakukan ini. Yang paling sederhana, yang pernah saya gunakan sebelumnya, adalah menggunakan acara
body
.Pada tata letak saya, saya akan memiliki sesuatu di bagian bawah seperti ini:
Kemudian pada Tampilan Parsial saya (di bagian bawah):
Solusi lain adalah menggunakan tumpukan untuk mendorong semua skrip Anda, dan memanggil masing-masing di akhir. Solusi lain, seperti yang sudah disebutkan, adalah pola RequireJS / AMD, yang bekerja dengan sangat baik juga.
sumber
Solusi pertama yang dapat saya pikirkan, adalah menggunakan ViewBag untuk menyimpan nilai-nilai yang harus di-render.
Awalnya saya tidak pernah mencoba jika ini bekerja dari sudut pandang sebagian, tetapi harus dilakukan.
sumber
ViewBag.RenderScripts = new List<string>();
di bagian atas halaman utama, lalu dipanggil@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, lalu dimasukkan@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. Dalam tampilan sebagian saya cantumkan@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.Anda tidak perlu menggunakan bagian dalam tampilan sebagian.
Sertakan dalam Tampilan Parsial Anda. Ini menjalankan fungsi setelah jQuery dimuat. Anda dapat mengubah ketentuan klausa untuk kode Anda.
Julio Spader
sumber
Anda dapat menggunakan Metode Ekstensi ini : (Simpan sebagai PartialWithScript.cs)
Gunakan seperti ini:
Contoh parsial: (_MyPartial.cshtml) Masukkan html di if, dan js di yang lain.
Di _Layout.cshtml Anda, atau di mana pun Anda ingin agar skrip dari parsial ditampilkan, cantumkan yang berikut (satu kali): Hanya akan membuat javascript dari semua parsial pada halaman saat ini di lokasi ini.
Kemudian untuk menggunakan parsial Anda, cukup lakukan ini: Ini hanya akan membuat html di lokasi ini.
sumber
Ada cara untuk menyisipkan bagian dalam tampilan sebagian, meskipun tidak cantik. Anda harus memiliki akses ke dua variabel dari Tampilan induk. Karena bagian dari sebagian pandangan Anda adalah untuk membuat bagian itu, masuk akal untuk memerlukan variabel-variabel ini.
Begini tampilannya menyisipkan bagian dalam tampilan parsial:
Dan di halaman memasukkan tampilan parsial ...
Anda juga dapat menggunakan teknik ini untuk menentukan konten suatu bagian secara terprogram dalam kelas apa pun.
Nikmati!
sumber
Gagasan Pluto dengan cara yang lebih baik:
CustomWebViewPage.cs:
Tampilan \ web.config:
Melihat:
Sebagian (_BackendSearchForm.cshtml):
Layout page:
sumber
Ini berfungsi untuk saya yang memungkinkan saya untuk mencari co-javascript dan html untuk tampilan parsial dalam file yang sama. Membantu dengan proses berpikir untuk melihat html dan bagian terkait dalam file tampilan parsial yang sama.
Dalam Tampilan yang menggunakan Tampilan Parsial yang disebut "_MyPartialView.cshtml"
Dalam file Partial View
sumber
Saya memecahkan masalah ini dengan rute yang sangat berbeda (karena saya sedang terburu-buru dan tidak ingin menerapkan HtmlHelper baru):
Saya membungkus Tampilan Parsial saya dalam pernyataan if-else:
Lalu, saya menelepon Partial dua kali dengan ViewData khusus:
sumber
@Html.Partial("MyPartialViewScripts")
Saya memiliki masalah yang sama, di mana saya memiliki halaman master sebagai berikut:
tetapi tampilan sebagian tergantung pada beberapa JavaScript di bagian Script. Saya menyelesaikannya dengan mengkodekan tampilan parsial sebagai JSON, memuatnya ke dalam variabel JavaScript dan kemudian menggunakannya untuk mengisi div, jadi:
sumber
Anda dapat menggunakan Folder / index.cshtml sebagai masterpage lalu menambahkan skrip bagian. Kemudian, dalam tata letak Anda, Anda memiliki:
dan index.cshtml Anda:
dan itu akan bekerja pada semua tampilan parsial Anda. Ini bekerja untuk saya
sumber
Menggunakan Mvc Core Anda dapat membuat TagHelper rapi
scripts
seperti yang terlihat di bawah ini. Ini bisa dengan mudah diubah menjadisection
tag di mana Anda memberikan nama juga (atau nama tersebut diambil dari jenis turunannya). Perhatikan bahwa injeksi ketergantungan harus disiapkan untukIHttpContextAccessor
.Saat menambahkan skrip (mis. Sebagian)
Saat mengeluarkan skrip (misalnya dalam file tata letak)
Kode
sumber
Saya mengalami masalah yang hampir identik beberapa hari yang lalu, kecuali bahwa sebagian melihat adalah respons terhadap permintaan AJAX. Dalam situasi saya, sebagian sebenarnya adalah satu halaman penuh, tetapi saya ingin itu dapat diakses sebagai bagian dari halaman lain.
Jika Anda ingin membuat bagian secara parsial, solusi terbersih adalah membuat tata letak baru dan menggunakan variabel ViewBag. Ini tidak bekerja dengan
@Html.Partial()
atau yang baru<partial></partial>
, gunakan AJAX.Tampilan utama (bahwa Anda ingin ditampilkan sebagian di tempat lain):
Pengendali:
_layoutPartial.cshtml (baru):
Kemudian gunakan AJAX di halaman Anda.
Jika Anda ingin merender halaman dalam tata letak utama (bukan sebagian), maka jangan atur
ViewBag.Partial = true
. Tidak diperlukan bantuan HTML.sumber
Yah, saya kira poster-poster lain telah memberi Anda sarana untuk secara langsung memasukkan @seksi dalam sebagian Anda (dengan menggunakan bantuan html pihak ketiga).
Tapi, saya rasa, jika skrip Anda benar-benar digabungkan ke parsial Anda, cukup masukkan javascript Anda langsung di dalam
<script>
tag inline di dalam parsial Anda dan selesai dengan itu (hanya berhati-hati dari duplikasi skrip jika Anda berniat menggunakan parsial lebih dari sekali dalam satu tampilan);sumber
anggap Anda memiliki tampilan sebagian yang disebut _contact.cshtml, kontak Anda dapat berupa subjek hukum (nama) atau fisik (nama depan, nama belakang). tampilan Anda harus memperhatikan apa yang diberikan dan yang dapat dicapai dengan javascript. jadi rendering yang tertunda dan tampilan JS inside mungkin diperlukan.
satu-satunya cara saya berpikir, bagaimana ini dapat dinonaktifkan, adalah ketika kita menciptakan cara yang tidak mencolok dalam menangani masalah UI tersebut.
juga perhatikan bahwa MVC 6 akan memiliki apa yang disebut View Component, bahkan MVC futures memiliki beberapa hal serupa dan Telerik juga mendukung hal semacam itu ...
sumber
Saya baru saja menambahkan kode ini pada tampilan parsial saya dan menyelesaikan masalah, meskipun tidak terlalu bersih, ia berfungsi. Anda harus memastikan Id objek yang Anda render.
sumber
Saya memiliki masalah serupa yang diselesaikan dengan ini:
Itu cara yang bagus untuk menyuntikkan.
sumber