从引用项目的控制器获取价值,进入主项目控制器

时间:2018-12-13 21:13:16

标签: c# asp.net-mvc controller .net-assembly

我有许多ASP.NET MVC应用程序,它们的标头代码相同,因此我为标头创建了一个单独的ASP.NET MVC共享项目。我将存储过程中的数据加载到模型中以填充标题中的菜单,安装了RazorGenerator来编译视图和引用单个应用程序中的dll。效果很好。

存储过程中有一些数据,这些数据可以获取我希望在使用应用程序中使用的标题菜单的一些值。是否可以通过我消耗大量的ASP.NET MVC项目获得这些值?似乎不可能。如果我能以某种方式从引用的DLL中获取它,那就很好了,这样我就不必进行第二次冗余调用。我已经尝试了以下方法,但无济于事:

  • 在共享项目中设置Session或Tempdata变量。这些不会进入消耗项目。值为空
  • 我无法实例化新的类,例如

    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的控制器传递给使用的应用程序?就像我说的,我真的不想将原始的标头存储过程分为两个存储过程或进行冗余调用。

1 个答案:

答案 0 :(得分:0)

我最终使用了会话。最初,我在控制器操作方法中设置了会话值,但问题是当我在主要项目的控制器操作中检查会话数据时,这些值为null,从而在检查视图中的用户配置文件信息时导致错误。因此,我只是假设引用库中的类库可以读取使用中的应用程序的会话变量,但无法设置它们。

我错了。您可以

基本上,当我在Razor代码中添加标题视图(来自引用的库)时,在调用所有消耗项目的操作代码之后,引用的项目中的标题视图的代码才会执行当前视图并返回...所以本质上我想在它们存在之前获取会话字段。这就是为什么它们为空的原因。

您会认为我第二次运行页面(进行刷新)之后,会话字段将在那里,因为引用的操作方法将加载它们,但它们仍然为空。我仍然不知道为什么,我想弄清楚...但是我基本上只是成功地做到了这一点:

我将消耗项目的控制器设置为从自定义类继承。然后,在此自定义类的重写的OnActionExecuting()方法中...检查我的Session字段是否为空。如果是的话,那么(这可能是)我们第一次运行此程序,因此我将为引用的控制器创建一个新实例。我以该实例为例,并为标头调用action方法。这将导致会话数据的“初始加载”,然后任何项目(引用或消费)中的任何控制器尝试触发ANY操作代码。这样可以确保当任何控制器尝试引用这些会话字段时,它们都将存在。

从技术上讲,这会导致我的sproc在加载标头时重复运行两次,但仅在第一次加载页面时或某些清除会话的情况下对我有利。

在这种情况下,我读到Session是在类之间来回发送数据的一种不好的方式,这是我想要始终加载到Session变量中的用户配置文件信息,因此在我的情况下可以解决。如果这是其他类型的数据,那我就有问题了。