如何在asp.net mvc 3 razor视图中访问应用程序变量?

Chr*_*ris 27 c# razor asp.net-mvc-3

我在global.asa.cs中设置了一个Application变量:

    protected void Application_Start()
    {
        ...

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

    }
Run Code Online (Sandbox Code Playgroud)

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

@Application["LICENSE_NAME"]
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

Compiler Error Message: CS0103: The name 'Application' does not exist in the current context
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

Dar*_*rov 65

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

public class MyViewModel
{
    public string LicenseName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

<div>@Model.LicenseName</div>
Run Code Online (Sandbox Code Playgroud)

这是正确的MVC模式,应该如何完成.

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

  • +1不仅指向问题的解决方案,而且指向更好地遵循MVC模式的解决方案. (3认同)

Zac*_*een 23

@HttpContext.Current.Application["someindex"]
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 6

您可以使用自动生成的ApplicationInstance属性获取当前的Application :

@ApplicationInstance.Application["LICENSE_NAME"]
Run Code Online (Sandbox Code Playgroud)

但是,此逻辑不属于视图.


Kei*_*ith 5

您应该能够通过这个访问它HttpContext.Current.Application[],但是MVC最佳实践会声明您应该考虑通过View模型传递它.