我正在构建一个网站,该网站最终将从一个单独的域中提取图像。该域还不存在,甚至还没有确定其名称,所以目前我需要从本地目录访问图像。为了避免以后手动更改每个图像标签,我想使用一个全局变量,我可以更改一次并影响网站上的每个图像标签。
到目前为止,我已经找到了一个解决方案,那就是在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"];
}
}