Valeurs constantes globales sur l'ensemble du site MVC

11

Mon MVC (.NET) a des valeurs constantes sur tout le site, telles que le numéro de téléphone, l'adresse physique, l'adresse e-mail, etc.

Je voudrais stocker cette valeur une fois, afin que les futures mises à jour soient plus faciles lorsqu'elles changeront leurs détails.

Pour simplifier ma question, je me suis concentré uniquement sur le numéro de téléphone.

Ma question est de savoir où et comment stocker ce numéro et un problème que je rencontre avec ma décision. Pour le moment, j'ai choisi de le stocker dans le fichier Global.asax en tant que méthode statique, par exemple

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
       //logic
    }

    public static string GetPhoneNumber()
    {
        return "012345 678 910";
    }
}

Cela fonctionne très bien, dans mon contrôleur, je peux ajouter des références à cette méthode et l'assigner à un ViewBag

  public ActionResult Contact()
  {
        ViewBag.Phone = MvcApplication.GetPhoneNumber();
  }

Selon de nombreux sites, le numéro de téléphone sera visible en haut de chaque page et en tant que tel, le placer dans le _Layout.cshtmlest logique.

Le problème que j'ai, c'est qu'il n'y a pas de contrôleur (pas que je sache) pour le _Layout.cshtml et la seule façon dont je peux transmettre la valeur est d'avoir un ViewBag.Phone configuré pour chaque vue, EG

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Index()
    {
        ViewBag.Phone = MvcApplication.GetPhoneNumber();
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Phone = MvcApplication.GetPhoneNumber();
        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Phone = MvcApplication.GetPhoneNumber();
        return View();
    }

C'est désordonné et malodorant, mais je ne sais pas comment je peux améliorer cela.

Dois-je stocker mes variables globales dans un endroit différent ou existe-t-il une meilleure approche pour cela, car je suis sûr que c'est un problème commun.

Dave
la source

Réponses:

12

Stockez les valeurs dans web.config:

<appSettings>
  <add key="CompanyTelNo" value="012345 678 910" />
</appSettings>

Ensuite, dans votre code, vous pouvez le référencer avec:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Cependant, comme cela est en fait obsolète, il est préférable d'utiliser:

ConfigurationManager.AppSettings["CompanyTelNo"]
James
la source
Comment accéder à cette valeur depuis la page _Layout?
Dave
Similaire à ce que @ Richard-dalton a dit ci-dessus. sauf ne pas avoir les valeurs réelles dans une classe. Si ces valeurs changent, vous devez recompiler. S'ils sont dans la configuration, vous les modifiez simplement dans IIS.
James
1
Je pense que le ConfigurationSettings est obsolète, j'ai utilisé ConfigurationManager.AppSettings["MyKey"]exactement la même manière.
Dave
1
Remarque: je devais utiliser@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388
1
Identique à @DaveRook, sauf que vous n'avez pas de Using System.Configuration;déclaration en haut de votre fichier
James
6

Vous pouvez accéder aux constantes globales directement dans votre fichier _Layout.cshtml:

<div class="phone">@MvcApplication.GetPhoneNumber()</div>

Cependant, je déplacerais ces constantes dans un fichier séparé (j'ai généralement une classe statique Constants.cs) afin de ne pas ajouter de fouillis au fichier global.asax.

Aussi, je les aurais comme propriétés:

public static string PhoneNumber
{
    get { return "012345 678 910"; }
}

plutôt que des méthodes pour pouvoir y accéder n'importe où comme ceci:

Constants.PhoneNumber

S'ils sont susceptibles de changer souvent, il serait préférable d'avoir ces valeurs stockées dans un fichier de configuration ou une base de données afin de ne pas nécessiter de recompilation et de déploiement lorsqu'ils doivent être modifiés.

Richard Dalton
la source
2
Il pourrait également utiliser un simple fichier
.resx
@MvcApplication n'est pas reconnu dans les fichiers de vue ...
jeudi
1

Dans Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
  ...
  public const string PhoneNumber = "01234 567890";
  ...
}

Dans _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
Scott Rickman
la source