Глобальні постійні значення на всьому сайті MVC


11

Мій MVC (.NET) має постійні значення через сайт, такі як номер телефону, фізична адреса, електронна адреса тощо.

Я хотів би зберегти це значення один раз, тому майбутні оновлення простіше, коли вони змінять свої дані.

Щоб полегшити моє запитання, я зосередився лише на номері телефону.

Моє запитання - де і як зберігати цей номер і проблема, з якою я стикаюсь із своїм рішенням. На даний момент я вирішив зберігати його у файлі Global.asax як статичний метод, наприклад

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

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

Це працює дуже добре, у своєму контролері я можу додати посилання на цей метод і призначити його ViewBag

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

Як і для багатьох сайтів, номер телефону буде видно вгорі кожної сторінки, і таким чином розміщення його в _Layout.cshtmlлогічному значенні.

Проблема в тому, що для _Layout.cshtml немає контролера (не те, що я знаю), і єдиний спосіб передати значення - це встановити ViewBag.Phone для кожного перегляду, 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();
    }

Це безладний і смердючий, але я поняття не маю, як це можна покращити.

Чи потрібно зберігати мої глобальні змінні в іншому місці чи є кращий підхід до цього, оскільки я впевнений, що це загальна проблема.

Відповіді:


12

Збережіть значення у web.config:

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

Потім у своєму коді ви можете посилатися на нього:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Однак, оскільки це насправді застаріло, краще використовувати:

ConfigurationManager.AppSettings["CompanyTelNo"]

Як я можу отримати доступ до цього значення зі сторінки _Layout?
Дейв

Аналогічно тому, що сказав Річард-Далтон вище. за винятком відсутності фактичних значень у класі. Якщо ці значення змінюються, вам потрібно перекомпілювати. Якщо вони знаходяться в конфігурації, ви просто поміняєте їх у IIS.
Джеймс

1
Я думаю, що налаштування ConfigurationStars застарілі, я використовував ConfigurationManager.AppSettings["MyKey"]точно такий же спосіб.
Дейв

1
Примітка: мені довелося скористатися@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
Те саме, що і @DaveRook, за винятком того, що ви не маєте Using System.Configuration;декларації у верхній частині свого файлу
Джеймс

6

Ви можете отримати доступ до глобальних констант безпосередньо у вашому файлі _Layout.cshtml:

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

Однак я б перемістив ці константи в окремий файл (я зазвичай маю статичний клас Constants.cs), щоб не додавати безладу у файл global.asax.

Також я маю їх як властивості:

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

а не методи, щоб до них можна було отримати доступ будь-де:

Constants.PhoneNumber

Якщо вони, ймовірно, часто змінюються, то краще, щоб ці значення зберігалися у конфігураційному файлі чи базі даних, щоб вони не потребували перекомпіляції та розгортання, коли їх потрібно змінити.


2
Він також міг скористатися простим .resx-File :)
Кнерд

@MvcApplication не розпізнається у файлах перегляду ...
thedrs

1

У Global.asax.cs

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

У _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.