Элемент модели, передаваемый в словарь, имеет тип «MyType», но для этого словаря требуется элемент модели типа «MyType». - PullRequest
3 голосов
/ 12 июля 2011

Да, я прошел через вопросы с похожими названиями.Кажется, ни один из них не соответствует ситуации, в которой я нахожусь. Просто программист отправляет неверный тип объекта в представление.

Это именно то сообщение об ошибке, которое я получаю:

Элемент модели, передаваемый в словарь, имеет тип 'IS.Extensions.Models.ContactSelectList', но для этого словаря требуется элемент модели типа 'IS.Extensions.Models.ContactSelectList'.

Я начал перемещаться по представлениям и модельным классам в нашем решении, пытаясь сделать его похожим на фреймворк.Под этим я подразумеваю, что некоторые используемые нами виды / модели используются в нескольких приложениях MVC, а некоторые виды / модели являются специфическими для определенного приложения MVC.
Проблема возникла после перемещения представления ContactSelectList.
Общие представления находятся впроект, который использует генератор Razor для их компиляции.

У меня есть это на мой взгляд:

@model IS.Extensions.Models.ContactSelectList

и при отладке я вижу, что модель яотправка в метод RenderPartial имеет тот же тип: enter image description here

Некоторые идентификаторы:

  • IS - это веб-приложение MVC и ссылается на IS.Extensions
  • IS.Extensions - это библиотека классов, на которую ссылается IS
  • ContactSelectList.cshtml находится в IS \ Views \ Controls
  • Класс модели ContactSelectList.cs находится в IS.Extensions \ Models
  • «Родительское представление» (представление, которое запускает этот вызов RenderPartial, находится в «общем» проекте: ZModel.Web \ Views \ Controls

Кто-нибудь знает, что здесь происходит?Сообщения об ошибках немного запутаны и не помогают.

Редактировать после комментария Erics:

Сборка, содержащая класс модели (ContactSelectList.cs), загружается динамически,Зачем?Потому что я думал, что имеет смысл создать своего рода систему расширений / плагинов, в которой удаление определенной библиотеки DLL в определенном каталоге расширяет общие модели некоторыми приложениями.
Вот как (слегка изменено):

var zExtenderAssembly = Assembly.LoadFile(path);
extenderType = zExtenderAssembly.GetTypes().ToList().Where(t => t.GetInterface("IZExtender") != null).FirstOrDefault();
return (Activator.CreateInstance(extenderType) as IZExtender).CreateBO("ContactSelectList");

Метод CreateBo в ZExtender (реализует IZExtender) просто создает новый экземпляр ContactSelectList (который находится в той же библиотеке, что и ZExtender, поэтому отражение не требуется):

public Component CreateBO(string name)
{
    ...
            return new ContactSelectList();
    ...
}

1 Ответ

1 голос
/ 13 июля 2011

Я переместил расширение dll в каталог bin веб-приложения и изменил способ загрузки dll.
Я использовал для загрузки, указав полный путь к файлу .dll. Загрузив расширение dll с помощью Assembly.Load('myAssemblyName'), все заработало как раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...