首页 > 解决方案 > OnActionExecuting 未在引用的 MVC 项目中执行

问题描述

我有多个 ASP.NET MVC 5 项目,它们在页面顶部有标题/菜单,其中 html 完全相同。从数据库中提取了一些菜单项、徽标、链接。为了消除跨项目的这些冗余代码,我想只为标头使用一个共享项目,编译然后在每个应用程序中引用它。我使用了 RazorGenerator.Mvc,因此我的视图将在 DLL 中编译,并且我还使用 MvcSiteMapprovider 作为菜单。到目前为止一切正常。在共享/引用项目中,我创建了一个名为“CommonHeader.cshtml”的视图,当我将此部分视图添加到我的其他 MVC 项目并进行编译时,一切都很好。

不过,我对 Sessions 有一些问题。在共享项目的控制器中,我有以下功能

protected override void OnActionExecuting

...它调用存储过程并将链接/徽标之类的内容加载到 TempData 中,然后显示在我的标题中,例如 TempData.Peek("fieldname")。当我运行共享项目本身时,它会很好地加载我放入视图中的这些 TempData 字段。当我重建引用该项目的其他应用程序项目时,这些会话/临时数据字段似乎为空。我不是从消费应用程序视图中引用会话变量,而是从共享项目本身引用,所以你会认为它会工作,但是当从另一个项目引用代码时,这个 OnActionExecuting 函数似乎没有被执行。

奇怪的是,我的 MvcSiteProvider 用来构建站点地图/菜单的类仍然可以将内容加载到 Sessions 中。所以我知道我认为问题不在于引用的项目不能使用 Session。似乎引用项目中的控制器似乎没有运行 OnActionExecuting 代码。有谁知道为什么?或者我怎样才能让它工作而不必将我的所有会话加载到加载站点地图的那个类中,将它保存在主控制器中?

标签: c#asp.net-mvcasp.net-mvc-5session-state

解决方案


我从来没有弄清楚这一点,但我想我想出了一个更好的方法来处理它。我可以创建一个模型,调用用于获取所有这些信息(徽标、链接等)的存储过程并将其返回到我的标题视图。当然,每次页面加载时都会调用它,但如果它只是几个字段,那没什么大不了的。


推荐阅读