Saya punya halaman:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
Dan di atasnya, berikut ini:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Ini adalah objek DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
dan di sini adalah parsial:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Ketika Model.Tasks tidak nol, semuanya berfungsi dengan baik. Namun ketika nolnya saya dapatkan:
Item model yang diteruskan ke kamus adalah tipe 'DTOSearchResults' tetapi kamus ini membutuhkan item model tipe 'System.Collections.Generic.IEnumerable`1 [Task]'.
Saya pikir itu pasti tidak tahu kelebihan yang digunakan, jadi saya melakukan ini (lihat di bawah) secara eksplisit, tapi saya masih mendapatkan masalah yang sama!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Saya tahu saya bisa mengatasi ini dengan memeriksa nol, atau bahkan tidak melewati nol, tapi bukan itu intinya. Mengapa ini terjadi?
sumber
@ myandmycode jawabannya bagus, tapi jawaban yang sedikit lebih pendek
Ini berfungsi karena
ViewDataDictionary
hal yang memegang model, dan dapat menerima model sebagai parameter konstruktor. Ini pada dasarnya melewati kamus data tampilan "keseluruhan", yang tentu saja hanya berisi model yang mungkin-nol.sumber
new ViewDataDictionary(null)
? Karena itu akan memilih kelebihan yang berbeda, satu denganViewDataDictionary
parameter, yang mungkin tidak akan menerima nol.null
, itu sama dengan panggilannew ViewDataDictionary(null)
yang menyebabkan overload paling spesifik dipanggil.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Anda menggunakan konstruktor yang salah jika itu nol.Tampaknya ketika properti Model yang Anda lewati adalah null MVC dengan sengaja kembali ke Model "induk". Rupanya mesin MVC menginterpretasikan nilai model nol sebagai maksud untuk menggunakan yang sebelumnya.
Lebih detail sedikit di sini: ASP.NET MVC, tampilan sangat diketik, kesalahan parameter tampilan sebagian
sumber
Jika Anda tidak ingin kehilangan ViewData Anda sebelumnya dalam tampilan parsial, Anda dapat mencoba:
sumber
Sebuah solusi adalah membuat HtmlHelper seperti ini:
The
Partial<T>(...)
cocok sebelumPartial(...)
sangat nyaman dan tidak ada kesalahan ambiguitas saat kompilasi.Secara pribadi saya merasa sulit untuk memahami perilaku - sepertinya sulit membayangkan ini sebagai pilihan desain?
sumber
Meskipun ini telah dijawab, saya menemukan ini dan memutuskan saya ingin menyelesaikan masalah ini untuk proyek saya daripada menyelesaikannya
new ViewDataDictionary()
.Saya membuat serangkaian metode ekstensi: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
Saya juga menambahkan beberapa metode yang tidak memanggil parsial jika modelnya nol , ini akan menghemat banyak pernyataan if.
Saya membuat mereka untuk Razor, tetapi beberapa dari mereka juga harus bekerja dengan tampilan gaya aspx (yang menggunakan HelperResult mungkin tidak kompatibel).
Metode ekstensi terlihat seperti ini:
Ada juga metode untuk
IEnumerable<object>
model dan yang dibuang juga dapat disebut dengan lambda Razor yang memungkinkan Anda untuk membungkus sebagian hasil dengan beberapa html.Silakan menggunakannya jika Anda mau.
sumber
Solusi saya untuk ini adalah:
sumber