Valori globali costanti in tutto il sito MVC

11

Il mio MVC (.NET) ha alcuni valori costanti attraverso il sito, come il numero di telefono, l'indirizzo fisico, l'indirizzo email ecc.

Vorrei memorizzare questo valore una volta, quindi gli aggiornamenti futuri sono più facili quando cambiano i loro dettagli.

Per semplificare la mia domanda, mi sono concentrato solo sul numero di telefono.

La mia domanda è dove e come memorizzare questo numero e un problema che sto affrontando con la mia decisione. Al momento, ho scelto di memorizzarlo nel file Global.asax come metodo statico, ad esempio

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

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

Funziona molto bene, nel mio controller posso aggiungere riferimenti a questo metodo e assegnarlo a un ViewBag

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

Come per molti siti, il numero di telefono sarà visibile nella parte superiore di ogni pagina e, in quanto tale, posizionarlo in _Layout.cshtml è logico.

Il problema che ho è che non c'è nessun controller (non lo so) per il _Layout.cshtml e l'unico modo per passare il valore è avere un ViewBag.Phone impostato per ogni vista, 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();
    }

Questo è disordinato e puzzolente, ma non ho idea di come posso migliorarlo.

Devo memorizzare le mie variabili globali in un posto diverso o c'è un approccio migliore per questo perché sono sicuro che questo è un problema comune.

    
posta Dave 31.12.2013 - 10:46
fonte

3 risposte

12

Memorizza i valori in web.config:

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

Quindi nel tuo codice, puoi fare riferimento a:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Tuttavia, poiché in realtà è deprecato, è meglio usare:

ConfigurationManager.AppSettings["CompanyTelNo"]
    
risposta data 31.12.2013 - 12:22
fonte
6

È possibile accedere alle costanti globali direttamente nel file _Layout.cshtml:

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

Tuttavia, sposterei queste costanti in un file separato (generalmente ho una classe statica Constants.cs) in modo da non aggiungere confusione al file global.asax.

Inoltre, li avrei come proprietà:

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

piuttosto che i metodi in modo da poterli accedere ovunque in questo modo:

Constants.PhoneNumber

Se è probabile che cambino spesso sarebbe meglio avere questi valori memorizzati in un file di configurazione o in un database in modo che non richieda ricompilazione e distribuzione quando devono essere modificati.

    
risposta data 31.12.2013 - 12:18
fonte
1

In Global.asax.cs

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

In _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
    
risposta data 10.03.2015 - 12:29
fonte

Leggi altre domande sui tag