Почему добавление пространства имен класса бизнес-контроллера в DNN приводит к исчезновению модуля? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь сделать модуль доступным для поиска в 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?

1 Ответ

0 голосов
/ 17 июня 2020

Значение для businessControllerClass в манифесте должно быть в формате {FQCN}, {Assembly}. Это для схемы манифеста

Для вашего проекта, если пространство имен такое, как вы упомянули ProjectName.ListaNews.ListaController, ваше имя сборки, скорее всего, ProjectName.ListaNews, что будет означать правильное значение для businessControllerClass

ProjectName.ListaNews.ListaController, ProjectName.ListaNews

Если это не поможет, как сказал Крис Хаммонд, вы можете использовать журналы, чтобы получить более подробную информацию об ошибке

...