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

时间:2011-03-12 23:26:53

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

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

    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

正确的语法是什么?

7 个答案:

答案 0 :(得分:65)

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

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 :(得分:23)

@HttpContext.Current.Application["someindex"]

答案 2 :(得分:6)

您可以使用自动生成的ApplicationInstance property

获取当前的应用程序
@ApplicationInstance.Application["LICENSE_NAME"]

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

答案 3 :(得分:5)

您应该能够通过HttpContext.Current.Application[]访问此内容,但是MVC最佳做法会声明您应该考虑通过View模型传递此内容。

答案 4 :(得分:4)

在上面回答的@ 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)

答案 5 :(得分:1)

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        var e = "Hello";
        Application["value"] = e;
    }

@ HttpContext.Current.Application [ “值”]

答案 6 :(得分:0)

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

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