Valores constantes globais em todo o site MVC

11

Meu MVC (.NET) possui valores constantes em todo o site, como número de telefone, endereço físico, endereço de email etc.

Gostaria de armazenar esse valor uma vez, para que futuras atualizações sejam mais fáceis quando eles mudarem seus detalhes.

Para simplificar minha pergunta, concentrei-me apenas no número de telefone.

Minha pergunta é onde e como armazenar esse número e um problema que estou enfrentando com minha decisão. No momento, eu escolhi armazená-lo no arquivo Global.asax como um método estático, por exemplo,

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

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

Isso funciona muito bem, no meu controlador eu posso adicionar referências a este método e atribuí-lo a um ViewBag

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

De acordo com muitos sites, o número de telefone estará visível na parte superior de todas as páginas e, como tal, colocá-lo no _Layout.cshtmlé lógico.

O problema que tenho é que não há um controlador (não que eu saiba) para o _Layout.cshtml e a única maneira de passar o valor é ter um ViewBag.Phone configurado para todas as visualizações, por exemplo

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();
    }

Isso é confuso e fedorento, mas não tenho idéia de como posso melhorar isso.

Devo armazenar minhas variáveis ​​globais em um local diferente ou há uma abordagem melhor para isso, pois tenho certeza de que esse é um problema comum.

Dave
fonte

Respostas:

12

Armazene os valores em web.config:

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

Em seguida, no seu código, você pode fazer referência a:

ConfigurationSettings.AppSettings["CompanyTelNo"];

No entanto, como isso foi preterido, é melhor usar:

ConfigurationManager.AppSettings["CompanyTelNo"]
James
fonte
Como eu acessaria esse valor na página _Layout?
Dave
Semelhante ao que @ Richard-dalton disse acima. exceto não ter os valores reais em uma classe. Se esses valores mudarem, você precisará recompilar. Se eles estiverem na configuração, basta alterá-los no IIS.
31413 James
1
Eu acho que o ConfigurationSettings é obsoleto, usei ConfigurationManager.AppSettings["MyKey"]exatamente da mesma maneira.
Dave
1
Nota: Eu tive que usar@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388
1
Mesmo que @DaveRook, exceto que você não tem uma Using System.Configuration;declaração na parte superior do seu arquivo
James
6

Você pode acessar constantes globais diretamente no seu arquivo _Layout.cshtml:

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

No entanto, eu moveria essas constantes para um arquivo separado (geralmente tenho uma classe estática Constants.cs) para não adicionar confusão ao arquivo global.asax.

Além disso, eu os teria como propriedades:

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

em vez de métodos, para que eles possam ser acessados ​​em qualquer lugar como:

Constants.PhoneNumber

Se é provável que eles mudem com frequência, seria melhor ter esses valores armazenados em um arquivo de configuração ou banco de dados, para que não exija uma recompilação e implantação quando eles precisarem ser alterados.

Richard Dalton
fonte
2
Ele também pode usar um .resx-File simples :)
Knerd
O @MvcApplication não é reconhecido nos arquivos de exibição ...
thedrs
1

Em Global.asax.cs

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

Em _Layout.cshtml

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