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 に答える