1

我正在构建一个最终会从单独的域中提取图像的站点。那个域还不存在,它的名字也没有定论,所以我暂时需要从本地目录访问图像。为了避免以后手动更改每个图像标签,我想使用一个全局变量,我可以更改一次并影响网站上的每个图像标签

到目前为止,我找到了一种解决方案,即在 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 的精神,我正在寻找一种方法,我可以分配一次变量,并在每个页面中隐含它的存在,而不管模型、控制器或视图如何。

4

2 回答 2

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

于 2013-08-16T16:19:40.683 回答
0

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

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

现在这个值可用于控制器继承自的所有视图BaseController

public abstract class BaseController : Controller
{
  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
      ViewBag.ImageSource = System.Configuration.ConfigurationManager.AppSettings["ImageSource"];
  }
}
于 2013-08-16T16:17:49.597 回答