Belum dicoba oleh saya, tetapi Anda mungkin melihat mendaftarkan tampilan Anda dan kemudian menyetel data tampilan selama proses aktivasi.
Karena tampilan didaftarkan saat itu juga, sintaks pendaftaran tidak membantu Anda menghubungkan ke Activated
acara, jadi Anda perlu menyiapkannya di Module
:
class SetViewBagItemsModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistration registration,
IComponentRegistry registry)
{
if (typeof(WebViewPage).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (s, e) => {
((WebViewPage)e.Instance).ViewBag.Global = "global";
};
}
}
}
Ini mungkin salah satu dari saran-jenis "satu-satunya alat adalah palu" dari saya; mungkin ada cara sederhana berkemampuan MVC untuk mendapatkannya.
Sunting: Alternatif, lebih sedikit pendekatan kode - cukup pasang ke Controller
public class SetViewBagItemsModule: Module
{
protected override void AttachToComponentRegistration(IComponentRegistry cr,
IComponentRegistration reg)
{
Type limitType = reg.Activator.LimitType;
if (typeof(Controller).IsAssignableFrom(limitType))
{
registration.Activated += (s, e) =>
{
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
};
}
}
}
Edit 2: Pendekatan lain yang bekerja langsung dari kode registrasi pengontrol:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Resolve
bagian darie.Context.Resolve
? Saya harus menyebutkan bahwa saya sudah terbiasa dengan Ninject ...Cara terbaik adalah menggunakan ActionFilterAttribute. Saya akan menunjukkan cara menggunakannya di .Net Core dan .Net Framework.
.Net Core 2.1 & 3.1
Kemudian Anda perlu mendaftarkannya di startup.cs Anda.
.Net Core 3.1
.Net Core 2.1
Kemudian Anda dapat menggunakannya di semua tampilan dan halaman
.Net Framework (ASP.NET MVC .Net Framework)
daftarkan kelas kustom Anda di global. asax (Application_Start)
Kemudian Anda dapat menggunakannya di semua tampilan
Juga ada cara lain
Membuat metode ekstensi di HtmlHelper
Kemudian Anda dapat menggunakannya di semua tampilan
sumber
MembershipService
?Karena properti ViewBag, menurut definisi, terkait dengan presentasi tampilan dan logika tampilan ringan apa pun yang mungkin diperlukan, saya akan membuat WebViewPage dasar dan mengatur properti pada inisialisasi halaman. Ini sangat mirip dengan konsep pengontrol dasar untuk logika berulang dan fungsionalitas umum, tetapi untuk tampilan Anda:
Dan kemudian
\Views\Web.config
, setelpageBaseType
properti:sumber
ViewBag.Title
properti dan kemudian satu-satunya hal dalam tata letak bersama adalah<title>@ViewBag.Title</title>
. Ini tidak akan benar-benar sesuai untuk sesuatu seperti halaman tampilan aplikasi dasar karena setiap tampilan berbeda, dan halaman tampilan dasar akan untuk data yang benar-benar umum di semua tampilan.Pos Brandon tepat tentang uang. Sebagai soal fakta, saya akan mengambil langkah lebih lanjut dan mengatakan bahwa Anda hanya harus menambahkan benda-benda umum Anda sebagai sifat dari dasar WebViewPage sehingga Anda tidak perlu item cor dari ViewBag di setiap tunggal View. Saya melakukan penyiapan CurrentUser dengan cara ini.
sumber
'ASP._Page_Views_Shared__Layout_cshtml' does not contain a definition for 'MyProp' and no extension method 'MyProp' accepting a first argument of type 'ASP._Page_Views_Shared__Layout_cshtml' could be found (are you missing a using directive or an assembly reference?)
Anda dapat menggunakan ActionResult kustom:
Atau bahkan ActionFilter:
Memiliki proyek MVC 2 yang terbuka tetapi kedua teknik tersebut masih berlaku dengan perubahan kecil.
sumber
Anda tidak perlu mengotak-atik tindakan atau mengubah model, cukup gunakan pengontrol dasar dan transmisikan pengontrol yang ada dari tata letak konteks tampilan.
Buat pengontrol dasar dengan data umum yang diinginkan (judul / halaman / lokasi dll) dan inisialisasi tindakan ...
Pastikan setiap pengontrol menggunakan pengontrol dasar ...
Transmisikan pengontrol dasar yang ada dari konteks tampilan di
_Layout.cshml
halaman Anda ...Sekarang Anda dapat merujuk ke nilai-nilai di pengontrol dasar dari halaman tata letak Anda.
sumber
Jika Anda ingin mengkompilasi pemeriksaan waktu dan kecerdasan untuk properti dalam tampilan Anda, maka ViewBag bukanlah cara yang tepat.
Pertimbangkan kelas BaseViewModel dan buat model tampilan Anda yang lain mewarisi dari kelas ini, misalnya:
Base ViewModel
Lihat ViewModel tertentu
Sekarang kode tampilan dapat mengakses properti secara langsung di tampilan
sumber
Saya telah menemukan pendekatan berikut untuk menjadi yang paling efisien dan memberikan kontrol yang sangat baik menggunakan file _ViewStart.chtml dan pernyataan bersyarat bila diperlukan:
_ ViewStart :
TampilanA :
Catatan :
sumber