Stałe wartości globalne w witrynie MVC

11

Mój MVC (.NET) ma pewne stałe wartości w całej witrynie, takie jak numer telefonu, adres fizyczny, adres e-mail itp.

Chciałbym zapisać tę wartość raz, aby przyszłe aktualizacje były łatwiejsze, gdy zmienią swoje dane.

Aby uprościć moje pytanie, skupiłem się tylko na numerze telefonu.

Moje pytanie dotyczy tego, gdzie i jak przechowywać ten numer, oraz problemu, który napotyka moja decyzja. W tej chwili postanowiłem zapisać go w pliku Global.asax jako metodę statyczną, np

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

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

Działa to bardzo dobrze, w moim kontrolerze mogę dodać odniesienia do tej metody i przypisać ją do ViewBag

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

Jak w wielu witrynach, numer telefonu będzie widoczny u góry każdej strony, dlatego umieszczenie go w _Layout.cshtmllogicznym miejscu jest logiczne.

Problem, który mam, to brak kontrolera (nie wiem, że) dla _Layout.cshtml, a jedynym sposobem na przekazanie wartości jest skonfigurowanie ViewBag.Phone dla każdego widoku, np.

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

Jest bałaganiarski i śmierdzący, ale nie mam pojęcia, jak mogę to poprawić.

Czy powinienem przechowywać moje zmienne globalne w innym miejscu, czy jest to lepsze podejście, ponieważ jestem pewien, że jest to powszechny problem.

Dave
źródło

Odpowiedzi:

12

Zapisz wartości w pliku web.config:

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

Następnie w kodzie możesz odwołać się do niego za pomocą:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Ponieważ jednak jest to przestarzałe, lepiej użyć:

ConfigurationManager.AppSettings["CompanyTelNo"]
James
źródło
Jak uzyskałem dostęp do tej wartości ze strony _Layout?
Dave
Podobne do tego, co powiedział @ Richard-dalton powyżej. z wyjątkiem braku rzeczywistych wartości w klasie. Jeśli te wartości się zmienią, musisz ponownie skompilować. Jeśli są w konfiguracji, wystarczy je zmienić w IIS.
James
1
Myślę, że ConfigurationSettings jest przestarzały, użyłem ConfigurationManager.AppSettings["MyKey"]dokładnie w ten sam sposób.
Dave
1
Uwaga: musiałem użyć@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388
1
To samo co @DaveRook, tyle że nie masz Using System.Configuration;deklaracji na górze pliku
James
6

Możesz uzyskać dostęp do globalnych stałych bezpośrednio w pliku _Layout.cshtml:

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

Jednak przenosiłbym te stałe do osobnego pliku (zazwyczaj mam klasę statyczną Constants.cs), aby nie dodawać bałaganu do pliku global.asax.

Chciałbym też mieć je jako właściwości:

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

zamiast metod, aby można było uzyskać do nich dostęp w dowolnym miejscu:

Constants.PhoneNumber

Jeśli często się zmieniają, lepiej byłoby przechowywać te wartości w pliku konfiguracyjnym lub bazie danych, aby nie wymagało to ponownej kompilacji i wdrożenia, gdy trzeba je zmienić.

Richard Dalton
źródło
2
Mógłby również użyć prostego pliku
.resx
@MvcApplication nie jest rozpoznawany w plikach widoku ...
thedrs
1

W Global.asax.cs

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

W _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
Scott Rickman
źródło