根据ASP.NET MVC中的主题更改图像

时间:2012-11-16 09:27:32

标签: html asp.net-mvc dependency-injection

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

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

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

1 个答案:

答案 0 :(得分: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。< / p>