MVC sitesi genelinde küresel sabit değerler


11

MVC (.NET) sitemde telefon numarası, fiziksel adres, e-posta adresi vb.Gibi bazı sabit değerler var.

Bu değeri bir kez saklamak istiyorum, bu nedenle gelecekteki güncellemeler ayrıntılarını değiştirdiklerinde daha kolay.

Sorumu kolaylaştırmak için yalnızca telefon numarasına odaklandım.

Sorum, bu numarayı nerede ve nasıl saklayacağım ve kararımda karşılaştığım bir problem. Şu anda, statik yöntem olarak Global.asax dosyasında saklamayı seçtim, örn.

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

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

Bu çok iyi çalışıyor, kontrol cihazımda bu yönteme referanslar ekleyebilir ve bir ViewBag'e atayabilirim

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

Birçok siteye göre, telefon numarası her sayfanın üst kısmında görünür olacak ve bu şekilde _Layout.cshtml, mantıksal olarak yerleştirilecektir .

Sahip olduğum sorun _Layout.cshtml için hiçbir denetleyici (bilmiyorum) yoktur ve değeri iletebilmemin tek yolu her görünüm, EG için ayarlanmış bir ViewBag.Phone olmasıdır.

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

Bu dağınık ve kötü kokulu ama bunu nasıl geliştirebileceğim hakkında hiçbir fikrim yok.

Küresel değişkenlerimi farklı bir yerde mi saklamalıyım yoksa bunun daha iyi bir yaklaşım var mıdır, çünkü bunun ortak bir sorun olduğuna eminim.

Yanıtlar:


12

Değerleri web.config dosyasına depolayın:

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

Daha sonra kodunuzda aşağıdakilere başvurabilirsiniz:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Ancak, bu aslında kullanımdan kaldırıldığından, kullanmak daha iyidir:

ConfigurationManager.AppSettings["CompanyTelNo"]

Bu değere _Layout sayfasından nasıl erişebilirim?
Dave

@ Richard-dalton yukarıda söylediklerine benzer. sınıfta gerçek değerlere sahip olmamak dışında. Bu değerler değişirse, yeniden derlemeniz gerekir. Yapılandırmadaysa, bunları yalnızca IIS'de değiştirirsiniz.
James

1
Bence ConfigurationSettings eski, ConfigurationManager.AppSettings["MyKey"]aynı şekilde kullandım.
Dave

1
Not:@System.Configuration.ConfigurationManager.AppSettings["myKey"]
Kullanmak

1
@DaveRook ile aynı, ancak Using System.Configuration;dosyanızın üst kısmında bir bildiriminiz yok
James

6

Global sabitlere doğrudan _Layout.cshtml dosyanızdan erişebilirsiniz:

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

Ancak, global.asax dosyasına dağınıklık eklemek için bu sabitleri ayrı bir dosyaya (genellikle bir Constants.cs statik sınıf var) taşımak.

Ayrıca, onları özellik olarak olurdu:

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

yöntemlerden ziyade aşağıdaki gibi herhangi bir yere erişilebilirler:

Constants.PhoneNumber

Sık sık değişme olasılığı varsa, bu değerlerin bir yapılandırma dosyasında veya veritabanında saklanması daha iyi olur, bu nedenle değiştirilmesi gerektiğinde yeniden derleme ve dağıtım gerektirmez.


2
Ayrıca basit bir .resx-File :) da kullanabilir
Knerd

@MvcApplication görünüm dosyalarında tanınmıyor ...
thedrs

1

Global.asax.cs içinde

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

_Layout.cshtml içinde

<div>Phone number: @MvcApplication.PhoneNumber</div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.