У меня есть страница:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
И на этом, следующее:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Вот объект DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
и вот частичное:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Когда Model.Tasks не имеет значения null, все работает нормально. Однако, когда его ноль, я получаю:
Элемент модели, передаваемый в словарь, имеет тип 'DTOSearchResults', но для этого словаря требуется элемент модели типа 'System.Collections.Generic.IEnumerable`1 [Task]'.
Я подумал, что он не должен знать, какую перегрузку использовать, поэтому я сделал это (см. Ниже), чтобы быть явным, но я все еще получаю ту же проблему!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Я знаю, что могу обойти это, проверяя на ноль, или даже не передавая ноль, но это не главное. Почему это происходит?
источник
Ответ @ myandmycode хорош, но немного короче
Это работает, потому что
ViewDataDictionary
это вещь, которая содержит модель, и она может принять модель в качестве параметра конструктора. Это в основном передает «полный» словарь данных представления, который, конечно, содержит только модель с нулевым значением.источник
new ViewDataDictionary(null)
? Потому что это выберет другую перегрузку сViewDataDictionary
параметром, который, вероятно, не будет принимать значения NULL.null
, это то же самое, что вызов,new ViewDataDictionary(null)
который вызывает наиболее специфическую перегрузку.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Вы используете неправильный конструктор, если он нулевой.Похоже, что когда свойство передаваемой вами модели равно нулю, MVC намеренно возвращается к «родительской» модели. По-видимому, механизм MVC интерпретирует нулевое значение модели как намерение использовать предыдущее.
Чуть подробнее здесь: ASP.NET MVC, строго типизированные представления, неполадки с частичными параметрами представления
источник
Если вы не хотите потерять свои предыдущие ViewData в частичном представлении, вы можете попробовать:
источник
Решением было бы создать HtmlHelper следующим образом:
Partial<T>(...)
Соответствует передPartial(...)
так удобно и нет ошибки неоднозначности при компиляции.Лично мне трудно понять поведение - кажется, трудно представить это как выбор дизайна?
источник
Хотя на этот вопрос уже получен ответ, я натолкнулся на это и решил, что хочу решить эту проблему для своего проекта, а не работать с ним
new ViewDataDictionary()
.Я создал набор методов расширения: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
Я также добавил некоторые методы, которые не вызывают партиал, если модель нулевая. , это сэкономит много, если заявления.
Я создал их для Razor, но некоторые из них также должны работать с представлениями в стиле aspx (те, которые используют HelperResult, вероятно, не совместимы).
Методы расширения выглядят так:
Существуют также методы для
IEnumerable<object>
моделей, а отбрасываемые также можно вызывать с помощью лямбды Razor, которые позволяют обернуть частичный результат некоторым HTML-кодом.Не стесняйтесь использовать их, если хотите.
источник
Мой обходной путь к этому:
источник