Mam stronę:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
I na tym następujące:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Oto obiekt DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
a oto częściowe:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Gdy Model.Tasks nie ma wartości NULL, wszystko działa dobrze. Jednak gdy jest zerowy, otrzymuję:
Element modelu przekazany do słownika jest typu „DTOSearchResults”, ale ten słownik wymaga elementu modelu typu „System.Collections.Generic.IEnumerable`1 [Zadanie]”.
Uznałem, że nie może wiedzieć, które przeciążenie użyć, więc zrobiłem to (patrz poniżej), aby być jawnym, ale wciąż mam ten sam problem!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Wiem, że mogę to obejść, sprawdzając wartość null lub nawet nie przekazując wartości null, ale nie o to chodzi. Dlaczego to się dzieje?
źródło
@ Odpowiedź myandmycode jest dobra, ale nieco krótsza
Działa to, ponieważ to
ViewDataDictionary
właśnie ono utrzymuje model i może zaakceptować model jako parametr konstruktora. Zasadniczo przekazuje to „cały” słownik danych widoku, który oczywiście zawiera tylko model możliwie zerowy.źródło
new ViewDataDictionary(null)
? Ponieważ wybrałoby to inne przeciążenie, zViewDataDictionary
parametrem, który prawdopodobnie nie zaakceptowałby wartości zerowych.null
taka sama jak wywołanie,new ViewDataDictionary(null)
które powoduje wywołanie najbardziej specyficznego przeciążenia.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Używasz niewłaściwego konstruktora, jeśli jest pusty.Wygląda na to, że gdy właściwość przekazywanego modelu ma wartość NULL, MVC celowo przywraca model „nadrzędny”. Najwyraźniej silnik MVC interpretuje wartość modelu zerowego jako zamiar użycia poprzedniej.
Nieco więcej szczegółów tutaj: ASP.NET MVC, mocno wpisane widoki, częściowe parametry wyświetlania usterki
źródło
Jeśli nie chcesz stracić poprzednich ViewData w widoku częściowym, możesz spróbować:
źródło
Rozwiązaniem byłoby utworzenie HtmlHelper w następujący sposób:
Partial<T>(...)
Dopasowane przedPartial(...)
tak wygodny i bez błędu niejednoznaczności podczas kompilacji.Osobiście trudno mi zrozumieć zachowanie - wydaje się, że trudno to sobie wyobrazić jako wybór projektu?
źródło
Chociaż udzielono na to odpowiedzi, natknąłem się na to i zdecydowałem, że chcę rozwiązać ten problem w moim projekcie, zamiast z nim pracować
new ViewDataDictionary()
.Stworzyłem zestaw metod rozszerzeń: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
Dodałem także kilka metod, które nie wywołują częściowego, jeśli model ma wartość null , zaoszczędzi to wiele instrukcji if.
Stworzyłem je dla Razor, ale kilka z nich powinno również działać z widokami w stylu aspx (te, które używają HelperResult prawdopodobnie nie są kompatybilne).
Metody rozszerzenia wyglądają następująco:
Istnieją również metody dla
IEnumerable<object>
modeli, a te odrzucone można również wywoływać za pomocą lambda Razor, które pozwalają owinąć częściowy wynik pewnym html.Możesz je wykorzystać, jeśli chcesz.
źródło
Moje obejście tego jest następujące:
źródło