Я пытаюсь сделать модуль доступным для поиска в DNN 9, поэтому я создал класс, который реализует ISearchable и переопределяет GetSearchItems.
в соответствии с этой документацией: https://www.dnnsoftware.com/wiki/isearchable
public SearchItemInfoCollection GetSearchItems(ModuleInfo ModInfo)
{
SearchItemInfoCollection SearchItemCollection = new SearchItemInfoCollection();
ArrayList Documents = GetDocuments(ModInfo.ModuleID, ModInfo.PortalID, true);
foreach (var objDocument in Documents)
{
SearchItemInfo SearchItem;
{
var withBlock = (DocumentInfo)objDocument;
int UserId = Null.NullInteger;
// If IsNumeric(.CreatedByUser) Then
// UserId = Integer.Parse(.CreatedByUser)
// End If
UserId = withBlock.CreatedByUserID;
SearchItem = new SearchItemInfo(ModInfo.ModuleTitle + " - " + withBlock.Title, withBlock.Title, UserId, withBlock.CreatedDate, ModInfo.ModuleID, withBlock.ItemId.ToString(), withBlock.Title + " " + withBlock.Category, "ItemId=" + withBlock.ItemId.ToString());
SearchItemCollection.Add(SearchItem);
}
}
return SearchItemCollection;
}
Но когда я добавляю пространство имен класса в манифест модуля, модуль исчезает со страницы (и индексация не работает).
Пространство имен класса ProjectName.ListaNews.ListaController
Я также попробовал ProjectName.ListaNews
и изменил его на DotNetNuke.Modules.ProjectName.ListaNews.ListaController
Я попытался изменить контроллер бизнес-класса как из настроек модуля, так и из файла .dnn.
Зачем добавлять пространство имен бизнес-класса разрушает мой модуль и заставляет его исчезнуть со страницы?
-------------- EDIT --------------- -
Имя класса бизнес-контроллера кажется правильным. Я проверил файл журнала и обнаружил такую ошибку:
DotNetNuke.Framework.Reflection - ProjectName.ListaNews.ListaController, ProjectName.ListaNews
System.IO.FileNotFoundException: Could not load file or assembly 'ProjectName.ListaNews' or one of its dependencies.
Cannot find specified file.
File name: 'ProjectName.ListaNews'
в папке bin\
есть ListaNews.dll
. Я попытался переименовать его в ProjectName.ListaNews.dll
, но у меня была та же ошибка (+ сайт cra sh).
Поэтому я изменил класс бизнес-контроллера на ListaNews.ListaController, ListaNews
без ProjectName
, и он дал новый ошибка:
DotNetNuke.Framework.Reflection - ListaNews.ListaController, ListaNews
System.TypeLoadException: Could not load type 'ListaNews.ListaController' from assembly 'ListaNews'.
Похоже, класс ListaController не найден.
Я заметил, что ListaController.cs не был определен в файле .dnn, когда я его установил.
Я добавил это в файл .dnn
<component type="File">
other files definitions....
<files>
<file>
<name>ListaController.cs</name>
</file>
</files>
</component>
Поэтому я удалил и переустановил свой модуль. Однако ничего не изменилось.
Это подсказка?
Спасибо
-------------- РЕДАКТИРОВАТЬ 2 ----- -----------
Поскольку это была ошибка пространства имен, я переместил класс контроллера из ListaController.cs в View.ascx.cs, и предыдущая ошибка исчезла, поэтому класс, вероятно, виден сейчас. Но модуль все еще не виден (вылетает), поэтому я проверил журнал, и он дал 2 очень похожие ошибки:
1)
Message: Value cannot be null. Parameter name: type
StackTrace: in System.Activator.CreateInstance(Type type, Boolean nonPublic)
in System.Activator.CreateInstance(Type type)
in DotNetNuke.UI.Skins.Pane.IsVesionableModule(ModuleInfo moduleInfo)
in DotNetNuke.UI.Skins.Pane.InjectModule(ModuleInfo module)
in DotNetNuke.UI.Skins.Skin.InjectModule(Pane pane, ModuleInfo module)
InnerMessage: Value cannot be null. Parameter name: type
InnerStackTrace: at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at DotNetNuke.Services.Search.ModuleIndexer.GetModuleList(Int32 portalId)
Я читал документацию по System.Activator.CreateInstance здесь: https://docs.microsoft.com/it-it/dotnet/api/system.activator.createinstance?view=netcore-3.1#System_Activator_CreateInstance_System_Type_System_Boolean _
и на самом деле CreateInstance имеет конструктор с type
параметр, но я думаю, что он вызывается в скомпилированных библиотеках DNN, и я не вижу, что происходит
Я добавил эту строку в конструктор
object instance = Activator.CreateInstance(typeof(ListaController));
, и он зарегистрировал эту ошибку:
Error Creating BusinessControllerClass
'ProjectName.ListaNews.ListaController, ProjectName.ListaNews' of
module(ProjectName.ListaNews) id=(577) in tab(45) and portal(0)
StackTrace:
at DotNetNuke.Services.Search.ModuleIndexer.ThrowLogError(ModuleInfo module,
Exception ex)
InnerMessage:Value cannot be null. Parameter name: type
InnerStackTrace:
at System.Activator.CreateInstance(Type type, Boolean nonPublic) at
system.Activator.CreateInstance(Type type) at
DotNetNuke.Services.Search.ModuleIndexer.GetModuleList(Int32 portalId)
Я нашел этот форум https://www.dnnsoftware.com/forums/threadid/495897/scope/posts/help-with-rror-in-custom-module поэтому я добавил конструктор без параметров в свой класс контроллера, но он ничего не изменил
Почему type
null в CreateInstance?