2011-04-11 35 views
1

負荷的形象在ASP.NET的MVC3在我MVC3 _Layout.cshtml頁面顯示我這樣如何動態使用jQuery

<body> 
    <div id="page"> 
     <div id="nonFooter"> 
      <div id="header"> 
       <img id="headerBanner" src="@Url.Content("~/Content/Images/banner.jpg")" alt="Banner" /> 
      </div> .... 

夠簡單的橫幅廣告圖片。

我想要做的是爲每個使用該網站的客戶端顯示不同的圖像,很可能這將由url確定,例如:www.mysite.com/clientA/Home(clientA確定要使用哪個圖像)

基本上所需的功能有點像CMS,但我們不需要一個完整的CMS,我們只需要替換一些圖像和顏色。

所以問題是這樣做的最好方法是什麼?

我的想法到目前爲止是使用jQuery更新SRC這樣

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#headerBanner').attr('src', whatToPutHere?); 
});  

但是我卡上的whatToPutHere「最佳實踐」。

它應該是...

  • 的圖像放在ViewBag在服務器端代碼(如@ ViewBag.BannerImage)?
  • 將圖像放入ViewModel中?
  • 某種類型的服務器調用來獲取/加載圖像(邏輯來確定使用哪個圖像必須是服務器端)...(這是另一個往返旅程嗎?)?
  • ...另一種方法?

任何幫助非常讚賞:-)

回答

2

我將只使用服務器端代碼來生成用戶特定的圖像URL 。我不會使用ViewBag或模型將數據傳遞給View,因爲它位於_Layout頁面中。在下面的例子中,爲了簡單起見,有靜態方法。如果你打算進行單元測試,它需要用非靜態方法來重構。

在_Layout.cshtml:

<img src="@AccountServices.BannerUrl" alt="Banner" /> 

在AccountServices.cs

public class AccountServices 
{ 
    public static string BannerUrl 
    { 
     get{ 
      // Your code to form the image URL, may be the following: 
      var bannerPathTemplate = "/images/banners/user-{0}.jpg"; 
      var user = CurrentUser;    
      if (user != null) 
      { 
       return string.Format(bannerPathTemplate, user.Id); 
      } 
      return string.Format(bannerPathTemplate, "unauthorized");    
     } 
    } 

    const string sessionKeyUser = "session-current-user"; 

    public static User CurrentUser 
    { 
     get{ 
      if (HttpContext.Current.Session[sessionKeyUser]==null){ 
       // HERE insert code to get the current **user** object from db     
       HttpContext.Current.Session[sessionKeyUser] = user; 
      } 
      return (User)HttpContext.Current.Session[sessionKeyUser]; 
     } 
    } 

} 

另一種方法來獲得橫幅HTML我用的是@ Html.RenderAction( 「你的行動」,「你的控制器「)。

1

我不會用JavaScript做到這一點。你爲什麼不通過de ViewBag傳遞路徑?

@if(ViewBag.ImagePath!=null) 
{ 
    <img id="headerBanner" src="@Url.Content(ViewBag.ImagePath)" alt="Banner" /> 
} 
else 
{ 
    <img id="headerBanner" src="@Url.Content("~/Content/Images/default-banner.jpg")" alt="Banner" /> 
} 

也許你可以有一個動作過濾器,以這個屬性與此動作過濾器添加到您的ViewBag和裝飾你的控制器......

1

決定使用哪個圖片取決於服務器,對不對?是。所以,這裏不需要JavaScript。您可以在ViewBag中確定服務器上的圖像路徑,或者您的ViewModel可能包含圖像路徑()。你會像你在第一個例子中那樣渲染你的路徑,但用 @Url.Content(Model.HeaderBannerImagePath)@Url.Content(ViewBag.HeaderBannerImagePath)

替換 @Url.Content("~/Content/Images/banner.jpg")