整个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没有控制器(我不知道),而我可以传递值的唯一方法是为每个视图(例如EG)设置一个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();
    }

这是凌乱和有臭味的,但我不知道该如何改善。

我应该将全局变量存储在其他位置还是有更好的方法,因为我确定这是一个常见问题。

Answers:


12

将值存储在web.config中:

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

然后,在您的代码中,可以使用以下代码进行引用:

ConfigurationSettings.AppSettings["CompanyTelNo"];

但是,由于实际上已弃用,最好使用:

ConfigurationManager.AppSettings["CompanyTelNo"]

如何从_Layout页面访问此值?
戴夫

类似于上面的@ Richard-dalton所说的。除了没有实际值在类中。如果这些值更改,则需要重新编译。如果它们在配置中,则只需在IIS中进行更改。
詹姆斯,

1
我认为ConfigurationSettings已过时,我ConfigurationManager.AppSettings["MyKey"]以完全相同的方式使用。
戴夫

1
注意:我必须使用@System.Configuration.ConfigurationManager.AppSettings["myKey"]
user1477388'1

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-File :)
Knerd

视图文件中无法识别
@MvcApplication

1

在Global.asax.cs中

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

在_Layout.cshtml中

<div>Phone number: @MvcApplication.PhoneNumber</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.