我正在构建一个最终将从单独的域中提取图像的网站。该域名尚不存在,甚至其名称也未得出结论,因此暂时我需要从本地目录访问图像。为了避免以后手动更改每个图像标记,我想使用一个全局变量,我可以更改一次并影响网站上的每个图像标记。
到目前为止,我找到了一个解决方案,即在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的精神,我正在寻找一些方法,我可以将变量分配一次并在每个页面中隐含它,无论模型,控制器或视图如何。
答案 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"];
}
}