J'ai défini une variable d'application dans mon global.asa.cs avec:
protected void Application_Start()
{
...
// load all application settings
Application["LICENSE_NAME"] = "asdf";
}
puis essayez d'accéder avec ma vue de rasoir comme ceci:
@Application["LICENSE_NAME"]
et obtenez cette erreur:
Compiler Error Message: CS0103: The name 'Application' does not exist in the current context
quelle est la syntaxe appropriée?
Les vues ne sont pas censées extraire des données de quelque part. Ils sont censés utiliser les données qui leur ont été transmises sous la forme d'un modèle de vue de l'action du contrôleur. Donc, si vous devez utiliser ces données dans une vue, la bonne façon de le faire est de définir un modèle de vue:
public class MyViewModel
{
public string LicenseName { get; set; }
}
demandez à votre action de contrôleur de la remplir de l'endroit où elle doit être remplie (pour une meilleure séparation des problèmes, vous pouvez utiliser un référentiel):
public ActionResult Index()
{
var model = new MyViewModel
{
LicenseName = HttpContext.Application["LICENSE_NAME"] as string
};
return View(model);
}
et enfin que votre vue fortement typée affiche ces informations à l'utilisateur:
<div>@Model.LicenseName</div>
C'est le modèle MVC correct et c'est ainsi que cela doit être fait.
Évitez les vues qui extraient des données comme pest, car aujourd'hui c'est l'état de l'application, demain c'est une boucle foreach
, la semaine prochaine c'est une requête LINQ et en un rien de temps vous finirez par écrire des requêtes SQL dans vos vues.
@HttpContext.Current.Application["someindex"]
Vous pouvez obtenir l'application actuelle en utilisant la propriété générée automatiquement ApplicationInstance
:
@ApplicationInstance.Application["LICENSE_NAME"]
Cependant, cette logique n'appartient pas à la vue.
Vous devriez pouvoir y accéder via HttpContext.Current.Application[]
, mais les meilleures pratiques MVC indiquent que vous devriez probablement envisager de passer par le biais de votre modèle d'affichage.
En s'appuyant sur le modèle @ Darin-Dimitrov répondu ci-dessus, j'ai passé un modèle dans une vue partielle, que j'ai chargée dans une page _Layout.
J'avais besoin de charger une page Web à partir d'une ressource externe sur Application Load, qui sera utilisée comme navigation d'en-tête sur plusieurs sites. C'est dans mon 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;
}
Voici mon action de contrôleur pour la vue partielle.
public class ProfileController : BaseController
{
public ActionResult HeaderNav()
{
var model = new Models.HeaderModel
{
NavigationHtml = HttpContext.Application["HeaderNav"] as string
};
return PartialView("_Header", model);
}
}
J'ai chargé la vue partielle dans la page _Layout comme ceci.
<div id="header">
@{Html.RenderAction("HeaderNav", "Profile");}
</div>
La vue partielle _Header.cshtml est très simple et charge simplement le html à partir de la variable d'application.
@model Models.HeaderModel
@MvcHtmlString.Create(Model.NavigationHtml)
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
var e = "Hello";
Application["value"] = e;
}
@ HttpContext.Current.Application ["valeur"]