【问题标题】:How do you access application variables in asp.net mvc 3 razor views?您如何在 asp.net mvc 3 razor 视图中访问应用程序变量?
【发布时间】:2011-03-12 23:26:52
【问题描述】:

我在 global.asa.cs 中设置了一个应用程序变量:

    protected void Application_Start()
    {
        ...

        // load all application settings
        Application["LICENSE_NAME"] = "asdf";

    }

然后尝试像这样使用我的剃刀视图访问:

@Application["LICENSE_NAME"]

并得到这个错误:

Compiler Error Message: CS0103: The name 'Application' does not exist in the current context

正确的语法是什么?

【问题讨论】:

  • 应用变量?与 .config 文件中的 appSettings 一样吗? (请更具体)
  • @Brad,他的意思是应用程序状态变量,如果您查看代码,它非常具体。
  • @Brad:我认为他的意思是应用程序状态对象中的值。
  • @Sanjeevakumar/@CodemOnkey:双重注明。谢谢。 ;-)
  • @BradChristie 双重指出,哈!我知道你在那里做了什么。

标签: c# asp.net-mvc-3 razor


【解决方案1】:

视图不应该从某个地方提取数据。他们应该使用从控制器操作以视图模型的形式传递给他们的数据。因此,如果您需要在视图中使用此类数据,正确的做法是定义视图模型:

public class MyViewModel
{
    public string LicenseName { get; set; }
}

让您的控制器操作从需要填充它的任何地方填充它(为了更好地分离您可能使用存储库的关注点):

public ActionResult Index()
{
    var model = new MyViewModel
    {
        LicenseName = HttpContext.Application["LICENSE_NAME"] as string
    };
    return View(model);
}

最后让您的强类型视图向用户显示此信息:

<div>@Model.LicenseName</div>

这是正确的 MVC 模式,应该这样做。

避免像害虫一样提取数据的视图,因为今天是应用程序状态,明天是 foreach 循环,下周是 LINQ 查询,您很快就会在视图中编写 SQL 查询。

【讨论】:

  • +1 不仅指向问题的解决方案,而且更符合 MVC 模式。
  • 如果您需要重用某些代码,例如在标题菜单中,您还可以创建单独的 ActionResult 来呈现部分视图。我需要从我的 _Layout 页面将模型发送到 PartialView 中,并且需要可重用的代码。我遵循了这种模式,并使用了 @{Html.RenderAction("ActionName", "ControllerName");}。 Action 返回了一个局部视图。
  • 嗨,我使用相同的模式,但有些代码使用静态变量而不是应用程序状态。我真的很想知道什么是正确的方法?
  • 如何为_layout视图设置数据?
  • 这个解决方案确实帮助我理解了视图和控件之间的分离。谢谢好心的先生,+1。附带说明一下,SO 在 View 中使用 linq 查询有更多的答案......也许我们可以做些什么?
【解决方案2】:
@HttpContext.Current.Application["someindex"]

【讨论】:

    【解决方案3】:

    您可以使用自动生成的ApplicationInstance property获取当前应用程序:

    @ApplicationInstance.Application["LICENSE_NAME"]
    

    但是,这个逻辑不属于视图。

    【讨论】:

    • 这可行,但 Visual Studio 和/或 Resharper 不喜欢它。 IDE 更喜欢 @HttpContext.Current.Application["someindex"],即使它们不是最佳实践。
    【解决方案4】:

    您应该能够通过HttpContext.Current.Application[] 访问它,但是 MVC 最佳实践表明您可能应该考虑通过您的视图模型传递它。

    【讨论】:

      【解决方案5】:

      基于上面回答的@Darin-Dimitrov 模式,我将模型传递到局部视图中,然后将其加载到 _Layout 页面中。

      我需要从 Application Load 上的外部资源加载网页,这将用作跨多个站点的标题导航。这是在我的 Global.asax.cs 中

      protected void Application_Start()
      {
          AreaRegistration.RegisterAllAreas();
      
          RegisterGlobalFilters(GlobalFilters.Filters);
          RegisterRoutes(RouteTable.Routes);
      
          Application["HeaderNav"] = GetHtmlPage("https://site.com/HeaderNav.html");
      }
      
      static string GetHtmlPage(string strURL)
      {
          string strResult;
          var objRequest = HttpWebRequest.Create(strURL);
          var objResponse = objRequest.GetResponse();
          using (var sr = new StreamReader(objResponse.GetResponseStream()))
          {
              strResult = sr.ReadToEnd();
              sr.Close();
          }
          return strResult;
      }
      

      这是部分视图的控制器操作。

      public class ProfileController : BaseController
      {
          public ActionResult HeaderNav()
          {
              var model = new Models.HeaderModel
              {
                  NavigationHtml = HttpContext.Application["HeaderNav"] as string
              };
              return PartialView("_Header", model);
          }
      }
      

      我像这样在_Layout页面中加载了局部视图。

      <div id="header">
           @{Html.RenderAction("HeaderNav", "Profile");}
      </div>
      

      局部视图_Header.cshtml 非常简单,只是从应用程序变量中加载html。

      @model Models.HeaderModel
      @MvcHtmlString.Create(Model.NavigationHtml)
      

      【讨论】:

        【解决方案6】:
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
        
                var e = "Hello";
                Application["value"] = e;
            }
        

        @HttpContext.Current.Application["value"]

        【讨论】:

          【解决方案7】:

          我在 MVC 控制器中遇到了这个问题,必须制作完全合格的 HttpContext 才能工作..

          System.Web.HttpContext.Current.Application["VarName"]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-09
            • 1970-01-01
            • 2011-09-02
            • 2018-01-09
            • 2010-11-06
            • 2013-03-28
            相关资源
            最近更新 更多