2013-12-09 8 views
1

이 질문의 전체 텍스트가 화면에 어떤 도움 hereMVC 4 테마 전환

감사 사용할 수 있습니다 - 원래의 게시물은 다음과 같습니다

그래서 나는 MvcMusicStore을 다운로드 완성을 발사 계획. 뷰 엔진을 확장하고 jquery 플러그인을 사용하는 것에 대한 모든 기사를 읽었지만 링크가 클릭되면 CSS 파일 경로를 변경하는 것보다 간단 할 수 있다고 생각하고 싶었습니다. 주로 내가 완전히 이해하지 못했던 그대로 코드를 복사하고 싶지 않았기 때문입니다. 저는 MVC를 처음 접했습니다. HomeController.cs으로

내가 추가 : 나는 다음 사이트의 두 복사본을 생성

public class ThemeModel 
{ 
    public static string GetSetThemeCookie(string theme) 
    { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userTheme"); 
     string rv = "Blue"; 
     if (theme != null) 
      rv = theme; 
     else 
     { 
      if (cookie != null) 
       rv = cookie["themeName"]; 
      else 
       rv = "Blue"; 
     } 

     cookie = new HttpCookie("userTheme"); 
     HttpContext.Current.Response.Cookies.Remove("userTheme"); 
     cookie.Expires = DateTime.Now.AddYears(100); 
     cookie["themeName"] = rv; 
     HttpContext.Current.Response.SetCookie(cookie); 
     return rv; 

    } 
} 

: 모델에

public ActionResult Theme(string themeName) 
    { 
     ViewBag.Theme = ThemeModel.GetSetThemeCookie(themeName); 
     return View(); 
    } 

내가이 클래스를 추가

그래서 이것은 내가 무슨 짓을 .css, 배경색과 font-family 만 변경하고 내 링크 태그를 생성하는보기.

<link href="@Url.Content(string.Format("~/Content/{0}.css", ViewBag.Theme))" rel="stylesheet" type="text/css" /> 

마지막으로 이러한 변경 사항을 _Layout.cshtml에 적용했습니다.

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
    @if (ViewBag.Theme == null) {Html.RenderAction("Theme", "Home");} 

<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" 
    type="text/javascript"></script> 
</head> 
<body> 
<div id="header"> 
    <h1><a href="/">ASP.NET MVC MUSIC STORE</a></h1> 
    <ul id="navlist"> 
     <li class="first"><a href="@Url.Content("~")" id="current">Home</a></li> 
     <li><a href="@Url.Content("~/Store/")">Store</a></li> 
     <li>@{Html.RenderAction("CartSummary", "ShoppingCart");}</li> 
     <li><a href="@Url.Content("~/StoreManager/")">Admin</a></li> 
    </ul> 
</div> 

@{Html.RenderAction("GenreMenu", "Store");} 

<div id="main"> 
    @RenderBody() 
</div> 

<div id="footer"> 
    Themes: @Ajax.ActionLink("Coral", "Theme", "Home", new { themeName = "Coral" }, null, new { @style = "color : coral"}) 
     @Ajax.ActionLink("Blue", "Theme", "Home", new { themeName = "Blue" }, null, new { @style = "color : blue;"}) 

</div> 
</body> 
</html> 

앱을 실행하면 일반 레이아웃이 두 ​​번 렌더링됩니다. 일단 장르 메뉴가 왼쪽에 렌더링되고 몸에는 아무것도 표시되지 않습니다. 그리고 다시 상위 5 개 앨범으로. 충분한 담당자가 없어서 이미지를 게시 할 수 없습니다.

내 산호초 링크를 클릭하면 테마가 바뀌고 상위 5 개 앨범없이 설정됩니다.

_Layout.cshtml :

그래서 여기에 좀 더 읽은 후 나는이 시도

@{Html.RenderAction("Theme", "Home");} 

HomeController.cs

public ActionResult Theme(string themeName) 
    { 
     ViewBag.Theme = ThemeModel.GetSetThemeCookie(themeName); 
     return PartialView(); 
    } 

하지만를이 중복 렌더링을 중지하더라도 테마 링크를 클릭하면 색상이 바뀌지 만 페이지에는 아무 것도 표시되지 않습니다.

지금은 정말 현혹되어 실제로 도움이 될 수 있습니다.

건배, .pd.

답변

1

오케이 - 여기 내가 어떻게 했는가.

자바 스크립트 파일을 만드십시오. 내 이름은 master.js입니다.

function ajaxSuccSetTheme(theme) { 
    $('#linkTheme').attr('href', '/Content/' + theme + '.css'); 
} 

_Layout을 수정하십시오.cshtml이에

@{ 
    if (ViewBag.Theme == null) { 
     ViewBag.Theme = MvcMusicStore.Models.ThemeModel.GetSetThemeCookie(); 
    } 
} 
<link id="linkTheme" href="@Url.Content(string.Format("~/Content/{0}.css", ViewBag.Theme))" rel="stylesheet" type="text/css" /> 

<script src="@Url.Content("~/Scripts/jquery-2.0.3.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/master.js")" type="text/javascript"></script> 

참고 :

  • 페이지가로드 테마가 ViewBag
  • 에 기록되지 않았을 것이다 처음에 jQuery를 선택으로 <link> 태그에 동일한 ID를 부여하여 js 파일 위
  • jQuery lib와 동일한 버전으로 눈에 띄지 않는 ajax jQuery 파일을 업데이트하십시오. 귀하의 Ajax.ActionLink는 그것 없이는 작동하지 않습니다.

그런 _Layout.cshtml 내 테마 전환 링크는 다음과 같습니다 :

<div id="footer"> 
    Themes : 
     @Ajax.ActionLink("Coral", "Theme", "Home", new { themeName = "Coral" }, 
      new AjaxOptions { HttpMethod = "POST", OnSuccess = string.Format("ajaxSuccSetTheme('{0}');", "Coral")}, 
      new { @style = "color : coral;" }) | 
     @Ajax.ActionLink("Blue", "Theme", "Home", new { themeName = "Blue" }, 
      new AjaxOptions { HttpMethod = "POST", OnSuccess = string.Format("ajaxSuccSetTheme('{0}');", "Blue")}, 
      new { @style = "color : blue;" }) 
</div> 

노트 그것에 :

  • THEMENAME = 당신의 테마 컨트롤러 메소드에 인수가 "무엇". 이것은 ThemeModel의 쿠키 메소드에 전달됩니다.
  • method = POST 그래서 IE는 캐시하지 않고 GET을하지 않음으로써 해결 된 몇 가지 다른 질문을 읽었습니다.
  • 자신의 args를 kludge해야합니다. onsuccess는 JS 콜백

다음에 HomeController.cs 변경 : 당신은 단지 우리가에서 필요로하는 모든 사촌 IsAjaxRequest() 확인하지 않고 null을 반환하는 경우

public ActionResult Theme(string themeName) 
    { 
     ViewBag.Theme = ThemeModel.GetSetThemeCookie(themeName); 
     if (Request.IsAjaxRequest()) 
     { 
      return PartialView(); 
     } 
     else 
     { 
      return null; 
     } 
    } 

솔직히, 그것은 중요하지 않습니다 설정하는 것입니다 다음에 logi 할 때 기억하는 쿠키 엔. 단지 ThemeModel에서 쿠키 설정 방법 잎

는 :

public class ThemeModel 
{ 
    public static string GetSetThemeCookie(string theme = null) 
    { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userTheme"); 
     string rv = "Blue"; 
     if (theme != null) 
      rv = theme; 
     else 
     { 
      if (cookie != null) 
       rv = cookie["themeName"]; 
      else 
      { 
       cookie = new HttpCookie("userTheme"); 
       rv = "Blue"; 
      } 
     } 

     cookie.Expires = DateTime.Now.AddYears(100); 
     cookie["themeName"] = rv; 
     HttpContext.Current.Response.SetCookie(cookie); 
     return rv; 

    } 
} 

희망 나는 누군가를 도왔다. 오히려 jQuery를에 모든 것을 할 것입니다 경우 여기 Tim Vanfosson's Theme Manager jQuery Plugin

건배,

.pd을합니다.