Да, я прошел через вопросы с похожими названиями.Кажется, ни один из них не соответствует ситуации, в которой я нахожусь. Просто программист отправляет неверный тип объекта в представление.
Это именно то сообщение об ошибке, которое я получаю:
Элемент модели, передаваемый в словарь, имеет тип 'IS.Extensions.Models.ContactSelectList', но для этого словаря требуется элемент модели типа 'IS.Extensions.Models.ContactSelectList'.
Я начал перемещаться по представлениям и модельным классам в нашем решении, пытаясь сделать его похожим на фреймворк.Под этим я подразумеваю, что некоторые используемые нами виды / модели используются в нескольких приложениях MVC, а некоторые виды / модели являются специфическими для определенного приложения MVC.
Проблема возникла после перемещения представления ContactSelectList.
Общие представления находятся впроект, который использует генератор Razor для их компиляции.
У меня есть это на мой взгляд:
@model IS.Extensions.Models.ContactSelectList
и при отладке я вижу, что модель яотправка в метод RenderPartial имеет тот же тип:
Некоторые идентификаторы:
- 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();
...
}