0

根据所选主题更改图像来源的最佳方法是什么?理想情况下,您将为每个主题设置一个 CSS,并将图像设置为例如背景(这就是我目前所做的)。

然而我现在需要做的是使用一个实际的图像,它是功能性的并且是演示的一部分,它不仅仅是一个作为设计一部分的图像。根据主题,此图像看起来会略有不同。

我正在保存每个用户在数据库中选择的主题。当用户根据数据库中的主题请求页面时,我希望能够更改图像的来源。我正在使用依赖注入 (StructureMap)、MVC 4 和 EF 5。我想以某种方式在我的 _Layout 页面中为 ViewBag.MyImagePath 分配值,然后所有页面都只有 src="@ViewBag.MyImagePath"。

4

1 回答 1

1

您可以编写一个主题感知图像助手:

public static class HtmlExtensions
{
    public static IHtmlString ThemeAwareImage(
        this HtmlHelper htmlHelper, 
        string image, 
        string alt = ""
    )
    {
        var context = htmlHelper.ViewContext.HttpContext;
        var theme = context.Session["theme"] as string;
        if (string.IsNullOrEmpty(theme))
        {
            // the theme was not found in the session 
            // => go and fetch it from your dabatase
            string currentUser = context.User.Identity.Name;
            theme = GetThemeFromSomeDataStore(currentUser);

            // cache the theme in the session for subsequent calls
            context.Session["theme"] = theme;
        }

        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var img = new TagBuilder("img");
        img.Attributes["alt"] = alt;
        img.Attributes["src"] = urlHelper.Content(
            string.Format("~/images/{0}/{1}", theme, image)
        );
        return new HtmlString(img.ToString(TagRenderMode.SelfClosing));
    }
}

可以在您的视图中使用它来渲染这些图像:

@Html.ThemeAwareImage("foo.jpg", "This is the foo image")

作为使用Session存储当前用户主题的更好选择,您可以将其缓存在 cookie 中,甚至更好地将其作为您的路线的一部分,在这种情况下,您的网站将更加 SEO 友好。

于 2012-11-16T09:38:32.210 回答