Giá trị không đổi toàn cầu trên toàn bộ trang web MVC


11

MVC của tôi (.NET) có một số giá trị không đổi thông qua trang web, chẳng hạn như số điện thoại, địa chỉ thực, địa chỉ email, v.v.

Tôi muốn lưu trữ giá trị này một lần, vì vậy các cập nhật trong tương lai sẽ dễ dàng hơn khi họ thay đổi chi tiết.

Để làm cho câu hỏi của tôi đơn giản hơn, tôi chỉ tập trung vào số điện thoại.

Câu hỏi của tôi là ở đâu và làm thế nào để lưu trữ số này và một vấn đề tôi gặp phải với quyết định của mình. Hiện tại, tôi đã chọn lưu trữ nó trong tệp Global.asax dưới dạng phương thức tĩnh, ví dụ:

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

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

Điều này hoạt động rất tốt, trong bộ điều khiển của tôi, tôi có thể thêm các tham chiếu đến phương thức này và gán nó cho ViewBag

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

Theo nhiều trang web, số điện thoại sẽ hiển thị ở đầu mỗi trang và do đó, đặt nó vào vị trí _Layout.cshtmlhợp lý.

Vấn đề tôi gặp phải là không có bộ điều khiển (không phải tôi biết) cho _Layout.cshtml và cách duy nhất tôi có thể vượt qua giá trị là cài đặt ViewBag.Phone cho mọi chế độ xem, 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();
    }

Điều này là lộn xộn và có mùi nhưng tôi không biết làm thế nào tôi có thể cải thiện điều này.

Tôi có nên lưu trữ các biến toàn cầu của mình ở một nơi khác hay có cách tiếp cận tốt hơn cho việc này vì tôi chắc chắn đây là một vấn đề phổ biến.

Câu trả lời:


12

Lưu trữ các giá trị trong web.config:

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

Sau đó, trong mã của bạn, bạn có thể tham chiếu nó với:

ConfigurationSettings.AppSettings["CompanyTelNo"];

Tuy nhiên, vì điều đó thực sự không được chấp nhận, nên sử dụng tốt hơn:

ConfigurationManager.AppSettings["CompanyTelNo"]

Làm cách nào tôi có thể truy cập giá trị này từ trang _Layout?
Dave

Tương tự như những gì @ Richard-dalton đã nói ở trên. ngoại trừ không có các giá trị thực tế trong một lớp. Nếu những giá trị đó thay đổi, bạn cần biên dịch lại. Nếu chúng ở cấu hình, thì bạn chỉ cần thay đổi chúng trong IIS.
James

1
Tôi nghĩ rằng Cấu hình cài đặt đã lỗi thời, tôi đã sử dụng ConfigurationManager.AppSettings["MyKey"]theo cách chính xác tương tự.
Dave

1
Lưu ý: Tôi đã phải sử dụng@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
Giống như @DaveRook, ngoại trừ bạn không có Using System.Configuration;tuyên bố ở đầu tệp của mình
James

6

Bạn có thể truy cập các hằng số toàn cầu trực tiếp trong tệp _Layout.cshtml của mình:

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

Tuy nhiên, tôi sẽ di chuyển các hằng số này vào một tệp riêng biệt (tôi thường có lớp tĩnh Constants.cs) để không thêm lộn xộn vào tệp global.asax.

Ngoài ra, tôi sẽ có chúng như tài sản:

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

thay vì các phương thức để chúng có thể được truy cập ở bất cứ đâu như vậy:

Constants.PhoneNumber

Nếu chúng có khả năng thay đổi thường xuyên, tốt hơn là nên lưu các giá trị này trong tệp cấu hình hoặc cơ sở dữ liệu để nó không yêu cầu biên dịch lại và triển khai khi cần thay đổi.


2
Anh ta cũng có thể sử dụng một tệp .resx đơn giản :)
Knerd

@MvcApplication không được công nhận theo quan điểm của các file ...
thedrs

1

Trong Global.asax.cs

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

Trong _Layout.cshtml

<div>Phone number: @MvcApplication.PhoneNumber</div>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.