【问题标题】:How can I create a global variable and make it available to all views in ASP.NET MVC 5 framework?如何创建全局变量并使其可用于 ASP.NET MVC 5 框架中的所有视图?
【发布时间】:2018-01-09 00:32:24
【问题描述】:

我有一个基于 ASP.NET MVC 5 框架编写的应用程序。

我创建了一个基本控制器,我的所有控制器都在其中。我的基本控制器是这样的

[Authorize]
public class BaseController : Controller
{
    protected IFlashManager Flash { get; set; }
    protected ICookie Cookie { get; set; }
    protected ICacheClient Cache { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        Cookie = new CookieJar(requestContext.HttpContext);
        Flash = new FlashManager(TempData);
        Cache = new StackExchangeRedisCacheClient(new NewtonsoftSerializer());
    }
}

我想让CookieCache 对象对我的所有视图全局可用。

微软对 User 对象做了同样的事情。

有没有办法在不使用ViewBagTempData 的情况下做到这一点?

【问题讨论】:

  • 你可以使用Session,分配一次,对象会一直存在到会话过期
  • 这里说的是什么User对象?如果 cookie 和缓存数据是按用户划分的,使用 Session 变量就足够了。
  • 创建一个包含CookieCache 属性的抽象ViewModel 怎么样?每个其他 ViewModel 都必须继承该抽象 ViewModel 并添加它的附加属性。这样你就可以说你的 @model 就是你创建的抽象 ViewModel。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

我创建了一个继承自 WebViewPage<T> 的新类。

  • 为您想要提供的每个新事物提供一个属性。
  • 覆盖InitHelpers() 以初始化这些属性。
  • 将系统配置为使用你的类而不是WebViewPage<T>

VB 示例:

Imports System.Linq.Expressions

Public Class ProjectMvcViewPage(Of T)
    Inherits WebViewPage(Of T)


    Public Overrides Sub InitHelpers()

        MyBase.InitHelpers()

        Framework = New FrameworkHelper(Of T)(MyBase.ViewContext, Me)

    End Sub



    Public Overrides Sub Execute()

    End Sub



    Public Overloads Property Framework As FrameworkHelper(Of T)


End Class

Public Class ProjectMvcViewPage
    Inherits ProjectMvcViewPage(Of Object)

End Class




Public Class FrameworkHelper(Of T)
    Inherits HtmlHelper(Of T)

    Public Sub New(ByVal viewContext As ViewContext, ByVal viewDataContainer As IViewDataContainer)
        MyBase.New(viewContext, viewDataContainer)
    End Sub

    Public Sub New(ByVal viewContext As ViewContext, ByVal viewDataContainer As IViewDataContainer, ByVal routeCollection As RouteCollection)
        MyBase.New(viewContext, viewDataContainer, routeCollection)
    End Sub



    '   TODO:   Framework-specific methods

End Class

Public Class FrameworkHelper
    Inherits AkcHtmlHelper(Of Object)

    Public Sub New(ByVal viewContext As ViewContext, ByVal viewDataContainer As IViewDataContainer)
        MyBase.New(viewContext, viewDataContainer)
    End Sub

    Public Sub New(ByVal viewContext As ViewContext, ByVal viewDataContainer As IViewDataContainer, ByVal routeCollection As RouteCollection)
        MyBase.New(viewContext, viewDataContainer, routeCollection)
    End Sub

End Class

...并在 Web.config 中注册它

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <!--<pages pageBaseType="System.Web.Mvc.WebViewPage">-->
    <pages pageBaseType="Project.ProjectMvcViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

【讨论】:

    【解决方案2】:

    这可能有效。

    HttpContext.Session.SetString("foo", "bar");
    HttpContext.Session.GetString("foo");
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2019-08-05
      • 2019-02-08
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多