Глобальные постоянные значения по всему сайту 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 для каждого представления, например

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
Я думаю, что ConfigurationSettings устарели, я использовал 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-файл :)
Knerd
@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>
Скотт Рикман
источник