如何在ASP.NET MVC 4中设置真正的全局变量?

时间:2013-08-16 14:51:01

标签: asp.net-mvc global-variables

我正在构建一个最终将从单独的域中提取图像的网站。该域名尚不存在,甚至其名称也未得出结论,因此暂时我需要从本地目录访问图像。为了避免以后手动更改每个图像标记,我想使用一个全局变量,我可以更改一次并影响网站上的每个图像标记

到目前为止,我找到了一个解决方案,即在Web.config的 appSettings 中设置一个键/值对,就像这样......

<appSettings>
  <add key="ImageSource" value="/some/local/directory" />
</appSettings>

然后,在每个视图中,在顶部,我添加...

@{
  string imgsrc = System.Configuration.ConfigurationManager.AppSettings["ImageSource"];
}

在我使用的HTML中......

<img src="@imgsrc/my_image.jpg" alt="my image" />

这可行,但它仍然需要我在我创建的每个视图模板中分配变量。根据DRY的精神,我正在寻找一些方法,我可以将变量分配一次并在每个页面中隐含它,无论模型,控制器或视图如何。

2 个答案:

答案 0 :(得分:1)

我喜欢在内置的HtmlHelper类中使用扩展方法来处理这类事情。您可以拥有HtmlHelper扩展名,例如:

    public static MvcHtmlString ImageReference(
        this HtmlHelper html,
        String id,
        String altText,
        String imageNameAndExtension)
    {

        var baseUrl = [go get the setting value];
        String src = String.Concat(baseUrl, imageNameAndExtension);

        var img = new TagBuilder("img");
        if (String.IsNullOrEmpty(id) == false) img.MergeAttribute("id", id);
        if (String.IsNullOrEmpty(altText) == false) img.MergeAttribute("alt", altText);
        img.MergeAttribute("src", src);

        return MvcHtmlString.Create(img.ToString(TagRenderMode.SelfClosing));

    }

然后消费:

@Html.ImageReference("TheImage", "A Cool Image", "doublerainbow.png")

通常你最终会有一些覆盖流过单个方法的覆盖(例如没有id参数等)。还有一些非常好的副作用。如果整个团队使用这些,你最终会得到非常标准化的标记。

更多信息: http://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs

答案 1 :(得分:0)

最简单的方法是将逻辑注入到每次执行的请求管道中,这样您只需将其设置在一个位置即可。然后,您需要在可供视图使用的位置设置ImageSource。

在下面的示例中,我创建了一个其他控制器继承的基本控制器。然后覆盖OnActionExecuting方法并设置ViewBag

现在,此值可供控制器从BaseController继承的所有视图使用。

public abstract class BaseController : Controller
{
  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
      ViewBag.ImageSource = System.Configuration.ConfigurationManager.AppSettings["ImageSource"];
  }
}