Valores constantes globales en todo el sitio MVC


11

Mi MVC (.NET) tiene algunos valores constantes en todo el sitio, como el número de teléfono, la dirección física, la dirección de correo electrónico, etc.

Me gustaría almacenar este valor una vez, para que las futuras actualizaciones sean más fáciles cuando cambien sus detalles.

Para simplificar mi pregunta, solo me he centrado en el número de teléfono.

Mi pregunta es dónde y cómo almacenar este número y un problema que enfrento con mi decisión. Por el momento, he elegido almacenarlo en el archivo Global.asax como un método estático, por ejemplo

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

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

Esto funciona muy bien, en mi controlador puedo agregar referencias a este método y asignarlo a una ViewBag

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

Según muchos sitios, el número de teléfono será visible en la parte superior de cada página y, como tal, colocarlo en el _Layout.cshtmles lógico.

El problema que tengo es que no hay un controlador (no lo sé) para _Layout.cshtml y la única forma en que puedo pasar el valor es tener un ViewBag.Phone configurado para cada 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();
    }

Esto es desordenado y maloliente, pero no tengo idea de cómo puedo mejorar esto.

¿Debería almacenar mis variables globales en un lugar diferente o hay un mejor enfoque para esto, ya que estoy seguro de que este es un problema común?

Respuestas:


12

Almacene los valores en web.config:

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

Luego, en su código, puede hacer referencia a él con:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Sin embargo, dado que en realidad está en desuso, es mejor usar:

ConfigurationManager.AppSettings["CompanyTelNo"]

¿Cómo accedería a este valor desde la página _Disposición?
Dave

Similar a lo que @ Richard-dalton dijo anteriormente. excepto no tener los valores reales en una clase. Si esos valores cambian, debe volver a compilar. Si están en la configuración, simplemente cámbielos en IIS.
James

1
Creo que ConfigurationSettings es obsoleto, lo usé ConfigurationManager.AppSettings["MyKey"]exactamente de la misma manera.
Dave

1
Nota: tuve que usar@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
Igual que @DaveRook, excepto que no tiene una Using System.Configuration;declaración en la parte superior de su archivo
James

6

Puede acceder a las constantes globales directamente en su archivo _Layout.cshtml:

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

Sin embargo, movería estas constantes a un archivo separado (generalmente tengo una clase estática Constants.cs) para no agregar desorden al archivo global.asax.

Además, los tendría como propiedades:

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

en lugar de métodos para poder acceder a ellos desde cualquier lugar así:

Constants.PhoneNumber

Si es probable que cambien a menudo, sería mejor tener estos valores almacenados en un archivo de configuración o en una base de datos, por lo que no es necesario volver a compilarlos ni implementarlos cuando sea necesario cambiarlos.


2
También podría usar un archivo .resx simple :)
Knerd

@MvcApplication no se reconoce en los archivos de vista ...
thedrs

1

En Global.asax.cs

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

En _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.