Valori costanti globali in tutto il sito MVC


11

Il mio MVC (.NET) ha alcuni valori costanti in tutto il sito, come il numero di telefono, l'indirizzo fisico, l'indirizzo e-mail ecc.

Vorrei memorizzare questo valore una volta, quindi gli aggiornamenti futuri sono più facili per 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 es

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, come tale, posizionandolo in _Layout.cshtmlè logico.

Il problema che ho è che non esiste un controller (non che io sappia) per _Layout.cshtml e l'unico modo in cui posso passare il valore è avere un ViewBag.Phone impostato per ogni vista, ad es.

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 migliorare.

Dovrei archiviare le mie variabili globali in un posto diverso o esiste un approccio migliore per questo in quanto sono sicuro che si tratti di un problema comune.

Risposte:


12

Memorizza i valori in web.config:

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

Quindi nel tuo codice, puoi fare riferimento con:

ConfigurationSettings.AppSettings["CompanyTelNo"];

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

ConfigurationManager.AppSettings["CompanyTelNo"]

Come posso accedere a questo valore dalla pagina _Layout?
Dave,

Simile a ciò che @ Richard-dalton ha detto sopra. salvo che non abbia i valori effettivi in ​​una classe. Se tali valori cambiano, è necessario ricompilare. Se sono in configurazione, è sufficiente modificarli in IIS.
James,

1
Penso che ConfigurationSettings sia obsoleto, l'ho usato ConfigurationManager.AppSettings["MyKey"]esattamente allo stesso modo.
Dave,

1
Nota: ho dovuto usare@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
Lo stesso di @DaveRook, tranne per il fatto che non hai una Using System.Configuration;dichiarazione all'inizio del file
James

6

Puoi accedere alle costanti globali direttamente nel tuo 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 disordine al file global.asax.

Inoltre, li avrei come proprietà:

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

piuttosto che metodi in modo da poter accedere ovunque in questo modo:

Constants.PhoneNumber

Se è probabile che cambino spesso, sarebbe meglio avere questi valori archiviati in un file di configurazione o in un database in modo che non richiedano una ricompilazione e una distribuzione quando devono essere cambiati.


2
Poteva anche usare un semplice file
.resx

@MvcApplication non è riconosciuto nei file di visualizzazione ...
giovedì

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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.