Menggunakan MVC 3 dengan mesin Razor view. Saya memiliki Pandangan ini:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Ini dipanggil dari tampilan lain menggunakan kode ini:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
Di kedua Tampilan, saat saya men-debug dan menonton Model, tampaknya berisi objek yang benar. Ketika saya menjalankan kode, saya mendapatkan kesalahan pada baris "var products =" yang mengatakan:
'object' tidak mengandung definisi untuk 'Products'
Adakah yang bisa menjelaskan kepada saya mengapa saya mendapatkan kesalahan itu? Sekali lagi, ketika saya melihat objek Model dalam mode debugging, itu terlihat baik-baik saja (memiliki 2 properti: Produk dan Ambang)
asp.net-mvc-3
razor
Ruud van Falier
sumber
sumber
Jawaban:
Apakah Anda meneruskan sebuah instance dari kelas anonim sebagai model tampilan? Saya baru saja mencoba ini (model tampilan dinamis dalam CSHTML) dan mendapatkan kesalahan yang sama seperti saat Anda menggunakan kelas anonim, tetapi berfungsi dengan baik jika saya membuat kelas bernama. Saya mencari tetapi belum melihat ini didokumentasikan di mana pun.
EDIT # 1:
Menurut David Ebbo , Anda tidak dapat meneruskan tipe anonim ke tampilan yang diketik secara dinamis karena tipe anonim dikompilasi sebagai
internal
. Karena tampilan CSHTML dikompilasi menjadi rakitan terpisah, itu tidak dapat mengakses properti tipe anonim.EDIT # 2:
David Ebbo telah mengedit postingannya dengan klarifikasi ini:
sumber
return View(new { Foo = 1, Bar = "test" });
? Karena saya menggunakan MVC 4 dan masih mendapatkan "objek tidak mengandung definisi untuk Foo"ToExpando
satu)Pada .NET 4.0 Jenis anonim dapat dengan mudah diubah ke ExpandoObjects dan dengan demikian semua masalah diperbaiki dengan overhead dari konversi itu sendiri. Lihat di sini
sumber
Ini tidak ada hubungannya dengan tipe anonim yang memiliki properti internal
Sangat mungkin untuk meneruskan tipe anonim dari tampilan ke tampilan parsial
Saya mengalami masalah yang sama hari ini dan itu tidak ada (secara langsung) ada hubungannya dengan masalah meneruskan tipe anonim dan
internal
properti yang melekat padanya .Karenanya, terkait pertanyaan OP, jawaban dari @Lucas tidak relevan - meskipun solusi tersebut akan berhasil .
Dalam pertanyaan OP, tipe anonim sedang diteruskan dari tampilan di perakitan X ke sebagian di perakitan X , oleh karena itu masalah yang dijelaskan oleh David Ebbo tentang properti yang bersifat internal untuk jenis anonim bukanlah konsekuensi; tipe yang dikompilasi untuk tampilan, tipe parsial dan anonim semuanya terkandung dalam rakitan yang sama .
Jadi apa yang menyebabkan kegagalan mendadak untuk meneruskan jenis anonim dari tampilan ke sebagian?
Setidaknya dalam situasi saya , saya menemukan bahwa itu karena memiliki tampilan lain di FOLDER SAMA yang menentukan jenis model yang tidak dapat diselesaikan . Tampilan dikompilasi pada waktu proses, sehingga akan masuk akal karena kegagalan pada waktu proses untuk mengompilasi tampilan juga berarti kegagalan untuk mengompilasi jenis dinamis dan sebagian hanya akan menerima
object
. Tidak segera jelas apa yang sedang terjadi, tetapi dalam contoh spesifik OP (dan milik saya) kemungkinan besar ini adalah penyebab masalahnya.Menarik untuk dicatat bahwa jika tipe model benar tetapi bagian lain dari tampilan tidak dikompilasi maka tipe anonim tidak terpengaruh dengan cara yang sama. Ini pasti tentang bagaimana Razor memecah kompilasi dinamis dari bagian komponen tampilan.
Setelah Anda memperbaiki tampilan yang melanggar, buat ulang seluruh solusi atau bersihkan dan buat ulang proyek sebelum memeriksa untuk melihat apakah sudah diperbaiki.
Untuk memastikan Anda tidak ketahuan lagi, Anda dapat mengaktifkan kompilasi waktu kompilasi tampilan Razor Anda dengan menambahkan ini ke
csproj
file Anda :sumber
Tambahkan kelas berikut di mana saja dalam solusi Anda (gunakan namespace Sistem, sehingga siap digunakan tanpa harus menambahkan referensi apa pun) -
Saat Anda mengirim model ke tampilan, konversikan ke Expando:
sumber
Alih-alih menggunakan
dynamic
jenis Model dalam tampilan parsial.Anda dapat memanggil atribut objek anonim menggunakan
@ViewData.Eval("foo")
bukan@Model.foo
.Kemudian Anda dapat menghapus
@Model dynamic
dari tampilan.Saya menemukan masalah ini baru-baru ini ketika menyampaikan beberapa atribut di antara tampilan untuk Integrasi Komentar Sosial Facebook. Kode contoh:
Kemudian dalam pandangan saya, saya baru saja memiliki div ini:
sumber
Saya tidak yakin Anda mendapatkan kesalahan ini karena Anda tidak menerapkan penyelesaiannya. saya mendapat kesalahan yang sama dalam tampilan parsial. solusinya adalah hanya membersihkan build dan membangunnya kembali. jika sintaksnya benar, kode seharusnya berfungsi, tetapi razor engine mungkin tidak memperbarui perubahan kode dengan benar.
sumber
Saya mengatasi masalah ini dengan menggunakan Kamus.
sumber
Untuk menggunakan
dynamic
tipe Anda perlu referensiMicrosoft.CSharp
perakitansumber