(PartialView) Элемент модели, переданный в словарь, имеет тип "Клиент", но для этого словаря требуется элемент модели типа "UserProfile",
@model Customer
@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile)
Когда я запускаю этот код, я получаю эту ошибку:
The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'.
Частичный вид _UserProfile строго типизирован.
Я хочу, чтобы иметь возможность редактировать это поле.
Любые предложения?
Ответы
Ответ 1
Убедитесь, что ваш Model.UserProfile не равен null.
Я нашел ваше сообщение, пытаясь отладить ту же ошибку, и оказалось, что я не инициализировал эквивалент "Model.UserProfile".
Я предполагаю, что происходит здесь, заключается в том, что если нулевая модель передается в RenderPartial, по умолчанию используется модель основного представления? Кто-нибудь может это подтвердить?
Ответ 2
Если Model.UserProfile имеет значение null, он попытается передать модель вашего клиента.
Два способа обойти это:
@model Customer
@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary())
Или:
@model Customer
if (Model.UserProfile != null)
{
@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile)
}
Ответ 3
Я столкнулся с этой проблемой при работе с частями профиля пользователя, такими как записи имени и адреса. Если у пользователя был неполный профиль, я хочу, чтобы представление управления учетными записями обнаружило нулевую запись адреса и отобразило ссылку "Действие" для создания нового адреса или отображения любых доступных данных адреса.
Как описано другими при передаче null, перегрузка для Html.RenderPartial запускается, и родительская модель просмотра передается. Я закончил преобразовывать свои частичные представления в шаблоны отображения и редактора, чтобы обойти его. Вот некоторые статьи How-To: Hansleman и codeguru
Вы получаете лучшее повторное использование этого метода и сохраняете нулевые значения:
В вашем представлении:
@Html.DisplayFor( m=> m.Address)
Затем обработайте нулевое значение в DisplayTemplate.
@model Namespace.Models.MyObject
...
if(@Model != null){
...
}else{
...
}
Ответ 4
Он будет возвращаться к исходной модели, если переданный элемент имеет значение null.
Попробуйте следующее:
@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile())
Ответ 5
Я столкнулся с той же проблемой, но, наконец, я понял это.
В пройденных моделях существует несоответствие типов. В вашем представлении используется модель типа Customer
, но вы частично просматриваете модель Userprofile
, так что вам нужно передать одну и ту же модель в обоих или... создать модель, которая обладает всеми свойствами обеих моделей. Конечно, ваша проблема будет решена.
Ответ 6
Ваша попытка применить объект типа Customer
к объекту типа UserProfile
. По умолчанию это не работает, поскольку структура не имеет понятия, как создавать эти объекты. Если вы абсолютно должны сделать это таким образом, единственным вариантом является предоставление явного оператора трансляции, например:
public static explicit operator Digit(byte b) // explicit byte to digit conversion operator
{
Digit d = new Digit(b); // explicit conversion
System.Console.WriteLine("Conversion occurred.");
return d;
}
Подробнее об этом можно узнать здесь.
Ответ 7
Добавьте ключевое слово "virtual" в свойство UserProfile на модели Customer.
Это самый простой способ преодолеть ленивую загрузку, но производительность.