Globale konstante Werte im gesamten MVC-Standort

11

Mein MVC (.NET) hat auf der gesamten Website einige konstante Werte, wie z. B. Telefonnummer, physische Adresse, E-Mail-Adresse usw.

Ich möchte diesen Wert einmal speichern, damit zukünftige Updates einfacher sind, wenn sie ihre Details ändern.

Um meine Frage zu vereinfachen, habe ich mich nur auf die Telefonnummer konzentriert.

Meine Frage ist, wo und wie diese Nummer gespeichert werden soll und ein Problem, mit dem ich bei meiner Entscheidung konfrontiert bin. Im Moment habe ich beschlossen, es als statische Methode in der Datei Global.asax zu speichern, z

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

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

Dies funktioniert sehr gut. In meinem Controller kann ich Verweise auf diese Methode hinzufügen und sie einem ViewBag zuweisen

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

Wie auf vielen Websites wird die Telefonnummer oben auf jeder Seite _Layout.cshtmlangezeigt. Daher ist es logisch , sie in die zu platzieren .

Das Problem, das ich habe, ist, dass es für die Datei _Layout.cshtml keinen Controller gibt (den ich nicht kenne). Die einzige Möglichkeit, den Wert zu übergeben, besteht darin, für jede Ansicht ein ViewBag.Phone einzurichten, z

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

Das ist chaotisch und stinkt, aber ich habe keine Ahnung, wie ich das verbessern kann.

Sollte ich meine globalen Variablen an einem anderen Ort speichern oder gibt es dafür einen besseren Ansatz, da ich sicher bin, dass dies ein häufiges Problem ist.

Dave
quelle

Antworten:

12

Speichern Sie die Werte in web.config:

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

Dann können Sie in Ihrem Code darauf verweisen mit:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Da dies jedoch tatsächlich veraltet ist, ist es besser, Folgendes zu verwenden:

ConfigurationManager.AppSettings["CompanyTelNo"]
James
quelle
Wie würde ich über die _Layout-Seite auf diesen Wert zugreifen?
Dave
Ähnlich wie @ Richard-Dalton oben gesagt hat. außer nicht die tatsächlichen Werte in einer Klasse zu haben. Wenn sich diese Werte ändern, müssen Sie neu kompilieren. Wenn sie sich in der Konfiguration befinden, ändern Sie sie einfach in IIS.
James
1
Ich denke, die ConfigurationSettings sind veraltet, ich habe sie ConfigurationManager.AppSettings["MyKey"]genauso verwendet.
Dave
1
Hinweis: Ich musste verwenden@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388
1
Wie @DaveRook, außer dass Sie keine Using System.Configuration;Erklärung oben in Ihrer Datei haben
James
6

Sie können direkt in Ihrer Datei _Layout.cshtml auf globale Konstanten zugreifen:

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

Ich würde diese Konstanten jedoch in eine separate Datei verschieben (ich habe im Allgemeinen eine statische Klasse Constants.cs), um der Datei global.asax keine Unordnung hinzuzufügen.

Außerdem hätte ich sie als Eigenschaften:

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

anstatt auf Methoden, damit überall darauf zugegriffen werden kann:

Constants.PhoneNumber

Wenn sie sich wahrscheinlich häufig ändern, ist es besser, diese Werte in einer Konfigurationsdatei oder Datenbank zu speichern, damit sie nicht neu kompiliert und bereitgestellt werden müssen, wenn sie geändert werden müssen.

Richard Dalton
quelle
2
Er könnte auch eine einfache .resx-Datei verwenden :)
Knerd
@ MVCApplication wird in Ansichtsdateien nicht erkannt ...
20.
1

In Global.asax.cs

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

In _Layout.cshtml

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