ค่าคงที่ส่วนกลางทั่วทั้งไซต์ MVC


11

My 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 ได้อย่างไร
เดฟ

คล้ายกับสิ่งที่ @ Richard-dalton กล่าวไว้ข้างต้น ยกเว้นการไม่มีค่าจริงในชั้นเรียน หากค่าเหล่านั้นเปลี่ยนแปลงคุณจะต้องคอมไพล์ใหม่ หากพวกเขาอยู่ในการกำหนดค่าแล้วคุณเพียงแค่เปลี่ยนพวกเขาใน IIS
James

1
ฉันคิดว่า ConfigurationSettings ล้าสมัยฉันใช้ConfigurationManager.AppSettings["MyKey"]ในลักษณะเดียวกัน
เดฟ

1
หมายเหตุ:ฉันต้องใช้@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
เช่นเดียวกับ @DaveRook ยกเว้นว่าคุณไม่มีการUsing System.Configuration;ประกาศที่ด้านบนสุดของไฟล์ของคุณ
James

6

คุณสามารถเข้าถึงค่าคงที่ส่วนกลางโดยตรงในไฟล์ _Layout.cshtml ของคุณ:

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

อย่างไรก็ตามฉันจะย้ายค่าคงที่เหล่านี้ไปยังไฟล์แยกต่างหาก (โดยทั่วไปฉันมี Constants.cs คลาสคงที่) เพื่อไม่ให้เพิ่มความยุ่งเหยิงในไฟล์ global.asax

นอกจากนี้ฉันจะให้พวกเขาเป็นคุณสมบัติ:

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

มากกว่าวิธีการเพื่อให้สามารถเข้าถึงได้ทุกที่เช่น:

Constants.PhoneNumber

หากพวกเขามีแนวโน้มที่จะเปลี่ยนบ่อยครั้งควรเก็บค่าเหล่านี้ไว้ในไฟล์ config หรือฐานข้อมูลจึงไม่จำเป็นต้องมีการคอมไพล์ใหม่และปรับใช้เมื่อจำเป็นต้องเปลี่ยนแปลง


2
นอกจากนี้เขายังสามารถใช้
resx

@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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.