Saya mendapatkan kesalahan berikut:
'objek' tidak mengandung definisi untuk 'RatingName'
Ketika Anda melihat tipe dinamis anonim, itu jelas memiliki RatingName.
Saya menyadari bahwa saya dapat melakukan ini dengan Tuple, tetapi saya ingin memahami mengapa pesan kesalahan terjadi.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
sumber
sumber
Saya menemukan jawabannya dalam pertanyaan terkait . Jawabannya ditentukan pada posting blog David Ebbo. Melewatkan benda anonim ke tampilan MVC dan mengaksesnya menggunakan dinamis
sumber
Menggunakan ToExpando metode adalah solusi terbaik.
Ini adalah versi yang tidak memerlukan perakitan System.Web :
sumber
Alih-alih membuat model dari jenis anonim dan kemudian mencoba mengonversi objek anonim menjadi
ExpandoObject
seperti ini ...Anda bisa langsung membuat
ExpandoObject
:Kemudian dalam tampilan Anda, Anda menetapkan jenis model sebagai dinamis
@model dynamic
dan Anda dapat mengakses properti secara langsung:Saya biasanya merekomendasikan model tampilan yang sangat diketik untuk sebagian besar tampilan, tetapi kadang-kadang fleksibilitas ini berguna.
sumber
Anda dapat menggunakan antarmuka kerangka kerja dadakan untuk membungkus tipe anonim dalam sebuah antarmuka.
Anda baru saja mengembalikan
IEnumerable<IMadeUpInterface>
dan pada akhir Linq Anda menggunakan.AllActLike<IMadeUpInterface>();
ini berfungsi karena ini memanggil properti anonim menggunakan DLR dengan konteks perakitan yang menyatakan tipe anonim.sumber
Menulis aplikasi konsol dan menambahkan Mono.Cecil sebagai referensi (Anda sekarang dapat menambahkannya dari NuGet ), kemudian menulis potongan kode:
Kode di atas akan mendapatkan file assembly dari input args dan menggunakan Mono.Cecil untuk mengubah aksesibilitas dari internal ke publik, dan itu akan menyelesaikan masalah.
Kita dapat menjalankan program di acara Post Build situs web. Saya menulis posting blog tentang ini dalam bahasa Cina tetapi saya yakin Anda bisa membaca kode dan snapshot. :)
sumber
Berdasarkan jawaban yang diterima, saya telah menimpa controller untuk membuatnya bekerja secara umum dan di belakang layar.
Ini kodenya:
Sekarang Anda bisa melewatkan objek anonim sebagai model, dan itu akan berfungsi seperti yang diharapkan.
sumber
Saya akan melakukan sedikit pencurian dari https://stackoverflow.com/a/7478600/37055
Jika Anda menginstal paket- dynamitey Anda dapat melakukan ini:
Dan para petani bersukacita.
sumber
Alasan RuntimeBinderException dipicu, saya pikir ada jawaban bagus di posting lain. Saya hanya fokus untuk menjelaskan bagaimana sebenarnya saya membuatnya bekerja.
Dengan merujuk ke jawaban @DotNetWise dan Binding dilihat dengan koleksi tipe Anonim di ASP.NET MVC ,
Pertama, Buat kelas statis untuk ekstensi
Di controller
Dalam View, @model IEnumerable (dinamis, bukan kelas model), ini sangat penting karena kita akan mengikat objek tipe anonim.
Ketik foreach, saya tidak memiliki kesalahan baik menggunakan var atau dinamis .
Omong-omong, buat ViewModel baru yang cocok dengan bidang baru juga bisa menjadi cara untuk meneruskan hasil ke tampilan.
sumber
Sekarang dalam rasa rekursif
sumber
Menggunakan ExpandoObject Extension berfungsi tetapi rusak saat menggunakan objek anonim bersarang.
Seperti
Untuk mencapai ini saya menggunakan ini.
Penggunaan dalam pengontrol adalah sama kecuali Anda menggunakan ToRazorDynamic () alih-alih ToExpando ().
Dalam pandangan Anda untuk mendapatkan seluruh objek anonim, Anda cukup menambahkan ".AnonValue" di akhir.
sumber
Saya mencoba ExpandoObject tetapi tidak berhasil dengan tipe kompleks bersarang anonim seperti ini:
Jadi solusi saya adalah mengembalikan model JObject to View:
dan konversikan ke dinamis dalam .cshtml:
sumber