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
मुझे लगता है कि कॉन्फ़िगरेशनसेटिंग अप्रचलित है, मैंने ConfigurationManager.AppSettings["MyKey"]ठीक उसी तरीके से उपयोग किया है।
डेव

1
नोट: मुझे इस्तेमाल करना था@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388

1
@DaveRook के समान, सिवाय इसके कि आपके पास Using System.Configuration;अपनी फ़ाइल के शीर्ष पर एक घोषणा नहीं है
जेम्स

6

आप अपनी _Layout.cshtml फ़ाइल में सीधे वैश्विक स्थिरांक तक पहुँच सकते हैं:

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

हालाँकि, मैं इन स्थिरांक को एक अलग फ़ाइल में ले जाऊंगा (मेरे पास आमतौर पर एक कांस्टेंट.एससी स्टैटिक क्लास है) ताकि अव्यवस्था को Global.asax फ़ाइल में न जोड़ा जा सके।

इसके अलावा, मैं उन्हें गुण के रूप में होगा:

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

तरीकों के बजाय इसलिए उन्हें कहीं भी पहुँचा जा सकता है:

Constants.PhoneNumber

यदि वे अक्सर बदलने की संभावना रखते हैं, तो इन मूल्यों को एक कॉन्फ़िगरेशन फ़ाइल या डेटाबेस में संग्रहीत करना बेहतर होगा, इसलिए जब उन्हें बदलने की आवश्यकता होती है, तो उन्हें एक recompile और परिनियोजन की आवश्यकता नहीं होती है।


2
वह एक साधारण .resx-File :)
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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.