Подтвердить что ты не робот

(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 строго типизирован.

Я хочу, чтобы иметь возможность редактировать это поле. Любые предложения?

4b9b3361

Ответ 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. Это самый простой способ преодолеть ленивую загрузку, но производительность.