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



我正在构建一个网站,该网站最终将从一个单独的域中提取图像。该域还不存在,甚至还没有确定其名称,所以目前我需要从本地目录访问图像。为了避免以后手动更改每个图像标签,我想使用一个全局变量,我可以更改一次并影响网站上的每个图像标签

到目前为止,我已经找到了一个解决方案,那就是在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的精神,我正在寻找一种方法,可以将变量分配一次,并使其隐含在每个页面中,无论模型、控制器或视图如何。

我喜欢在内置的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

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

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

现在,该值可用于控制器从BaseController继承的所有视图。

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

相关内容

  • 没有找到相关文章

最新更新