У меня много приложений ASP.NET MVC с одинаковым кодом для заголовков, поэтому я создал отдельный общий проект ASP.NET MVC для заголовка. Я загружаю данные из хранимой процедуры в модель, чтобы заполнить меню в заголовке, установил RazorGenerator для компиляции представлений и ссылки на dll в моих индивидуальных приложениях. Работает отлично.
Есть некоторые данные из хранимой процедуры, которая получает некоторые значения для меню заголовков, которые я хотел бы иметь в своих приложениях-потребителях. Можно ли каким-то образом получить эти значения из моих потребляющих проектов ASP.NET MVC? Это кажется невозможным. Было бы неплохо, если бы я мог просто каким-то образом получить его из указанной DLL, чтобы мне не приходилось делать второй избыточный вызов. Я пробовал следующее, и ничего не работает:
Я не могу создать экземпляр нового класса, например
ReferencedNamespace.modelrow bla = new ReferencedNamespace.modelrow();
Технически это единственный способ вернуть значения, но это, по сути, делает два вызова БД через модель проекта, на который указывает ссылка, так что это противоречит цели.
В классе упомянутых проектов я попытался создать свойство:
public string myvalue
{
get
{
return valuetoget;
}
}
и в контроллере, который изначально заполняет модель, я добавляю
valuetoget = whatever comes back from the stored procedure here
Но нет возможности сослаться на referenceNamespace.Controllers.Controllername.valuetopass. Я снова могу создать его экземпляр из проекта-потребителя, и он снова вызывает его дважды. Так что бесполезно.
Можно ли каким-либо образом передать эти данные из контроллера DLL, на который имеется ссылка, потребляющим приложениям? Как я уже сказал, я действительно не хочу разбивать мою исходную хранимую процедуру заголовка на две хранимые процедуры или выполнять избыточные вызовы.





В итоге я использовал сеансы. Первоначально я установил значения сеанса в методе действия контроллера, но проблема в том, что когда я проверял данные сеанса в действиях контроллера своих основных проектов, значения были нулевыми, что приводило к ошибкам при проверке информации профиля пользователя внутри моих представлений. Поэтому я просто предположил, что библиотеки классов в ссылочных библиотеках могут читать переменные сеанса потребляющего приложения, но не мог их установить.
Я ошибался. ты может.
По сути, когда я добавляю свое представление заголовка (которое поступает из указанной библиотеки) в код Razor, код для этого представления заголовка в указанном проекте не выполняется до тех пор, пока ПОСЛЕ того, как весь код действия потребляющего проекта не будет вызван для текущего представления и вернулся ... так что по сути я пытаюсь получить поля сеанса до того, как они появятся. Вот почему они были нулевыми.
Вы ДУМАЕТЕ, что ВТОРОЙ раз, когда я запустил страницу (выполняя обновление), ЗАТЕМ поля сеанса будут там, потому что указанный метод действия загрузил бы их, но они все еще были пустыми. Я до сих пор не знаю почему, и я хотел бы понять это ... НО я в основном просто успешно сделал это:
Я установил контроллеры моего потребляющего проекта на наследование от настраиваемого класса. Затем внутри переопределенного метода OnActionExecuting () этого настраиваемого класса ... я проверяю, являются ли мои поля сеанса нулевыми. Если это так, то это (вероятно) первый раз, когда мы запускаем это, поэтому я ЗАТЕМ создаю новый экземпляр моего ссылочного контроллера. Я беру этот экземпляр и вызываю метод действия для заголовка. Это вызовет «начальную загрузку» данных сеанса до того, как какие-либо контроллеры в любом проекте (упомянутом или потребляющем) попытаются запустить ЛЮБОЙ код действия. Это гарантирует, что когда любой контроллер попытается сослаться на эти поля сеанса, они будут там.
Технически это приводит к тому, что мой sproc запускается дважды при загрузке заголовка, но ТОЛЬКО при первой загрузке страницы или если что-то очищает сеанс, что меня устраивает.
Я читал, что сеансы - это плохой способ пересылки данных между классами, НО в этом случае это информация профиля пользователя, которую я в любом случае хотел загрузить в переменные сеанса, поэтому в моем случае это работает. Если бы это были данные любого другого типа, у меня были бы проблемы.