Nilai konstan global di seluruh situs MVC

11

MVC (.NET) saya memiliki beberapa nilai konstan di seluruh situs, seperti nomor telepon, alamat fisik, alamat email, dll.

Saya ingin menyimpan nilai ini sekali, sehingga pembaruan di masa mendatang lebih mudah ketika mereka mengubah detailnya.

Untuk membuat pertanyaan saya lebih sederhana, saya hanya fokus pada nomor telepon.

Pertanyaan saya adalah di mana dan bagaimana menyimpan nomor ini dan masalah yang saya hadapi dengan keputusan saya. Saat ini, saya memilih untuk menyimpannya di file Global.asax sebagai metode statis, misalnya

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

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

Ini bekerja dengan sangat baik, di controller saya, saya dapat menambahkan referensi ke metode ini dan menetapkannya ke ViewBag

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

Seperti banyak situs, nomor telepon akan terlihat di bagian atas setiap halaman dan dengan demikian, menempatkannya di _Layout.cshtmladalah logis.

Masalah yang saya miliki adalah tidak ada controller (bukan yang saya tahu) untuk _Layout.cshtml dan satu-satunya cara saya dapat melewati nilainya adalah dengan memiliki ViewBag. Telepon diatur untuk setiap tampilan, 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();
    }

Ini berantakan dan bau tetapi saya tidak tahu bagaimana saya bisa meningkatkan ini.

Haruskah saya menyimpan variabel global saya di tempat yang berbeda atau apakah ada pendekatan yang lebih baik untuk ini karena saya yakin ini adalah masalah umum.

Dave
sumber

Jawaban:

12

Simpan nilai di web.config:

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

Kemudian dalam kode Anda, Anda dapat merujuknya dengan:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Namun, karena itu sebenarnya sudah usang, lebih baik digunakan:

ConfigurationManager.AppSettings["CompanyTelNo"]
James
sumber
Bagaimana cara saya mengakses nilai ini dari halaman _Layout?
Dave
Mirip dengan apa yang dikatakan @ Richard-dalton di atas. kecuali tidak memiliki nilai aktual di kelas. Jika nilai-nilai itu berubah, Anda perlu mengkompilasi ulang. Jika mereka dalam konfigurasi, maka Anda cukup mengubahnya di IIS.
James
1
Saya pikir ConfigurationSettings sudah usang, saya menggunakan ConfigurationManager.AppSettings["MyKey"]cara yang sama persis.
Dave
1
Catatan: Saya harus menggunakan@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388
1
Sama seperti @DaveRook, kecuali Anda tidak memiliki Using System.Configuration;deklarasi di bagian atas file Anda
James
6

Anda dapat mengakses konstanta global secara langsung di file _Layout.cshtml Anda:

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

Namun, saya akan memindahkan konstanta ini ke file yang terpisah (saya biasanya memiliki kelas statis Constants.cs) agar tidak menambah kekacauan pada file global.asax.

Juga, saya akan menjadikannya sebagai properti:

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

daripada metode sehingga mereka dapat diakses di mana saja seperti:

Constants.PhoneNumber

Jika mereka cenderung berubah sering akan lebih baik untuk memiliki nilai-nilai ini disimpan dalam file konfigurasi atau database sehingga tidak memerlukan kompilasi ulang dan penyebaran ketika mereka perlu diubah.

Richard Dalton
sumber
2
Dia juga bisa menggunakan file .resx sederhana :)
Knerd
@MvcApplication tidak dikenali dalam file tampilan ...
ththrs
1

Di Global.asax.cs

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

Di _Layout.cshtml

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