2011-02-11 13 views
3

MVC 2 사이트에는 내 페이지에 javascript를 추가하는 데 사용되는 html 도우미가 있습니다. 내 마스터 페이지에는 내가 포함시키고 싶은 메인 자바 스크립트가 있고 aspx 페이지에는 페이지 별 자바 스크립트가 포함되어 있습니다. MVC2 도우미 MVC3 면도기 뷰 엔진으로 이동

.... 
<head> 
    <%=html.renderScripts() %> 
</head> 
... 
//core scripts for main page 
<%html.AddScript("/scripts/jquery.js") %> 
<%html.AddScript("/scripts/myLib.js") %> 
.... 

그런 다음 아이의 aspx 페이지에서, 나는 또한 다른 스크립트를 포함 할 수 있습니다

그래서 예를 들어, 내 Site.Master는 다음과 같이 있습니다. 전체 페이지에 자바 스크립트 파일을 렌더링됩니다 그래서

... 
//the page specific script I want to use 
<% html.AddScript("/scripts/register.aspx.js") %> 
... 

모두 수집 sitemaster 자리 표시 기능 RenderScripts에 의해 머리에 렌더링됩니다. 이것은 잘 작동합니다.

이제 MVC 3 및 ​​레이저 뷰 엔진에서 레이아웃 페이지가 다르게 동작합니다. 이제 페이지 레벨 자바 스크립트가 렌더링/포함되지 않기 때문입니다. 이제 LayoutMaster 내용을 볼 수 있습니다.

MVC 3 및 ​​면도기 뷰 엔진과 어떻게 솔루션을 사용할 수 있습니까? 참고로

(도우미가 이미 HTMLString을 ;-) 반환하도록 다시 작성되었습니다) :

... 
    ... 
    <head> 
    @{ 
     Html.AddJavaScript("/Scripts/jQuery.js"); 
     Html.AddJavaScript("/Scripts/myLib.js"); 
    } 
    //Render scripts 
    @html.RenderScripts() 
    </head> 
.... 

및 하위 페이지는 다음과 같습니다 : 내 MasterLayout은 다음과 같습니다

@{ 
    Layout = "~/Views/Shared/MasterLayout.cshtml"; 
    ViewBag.Title = "Child Page"; 
    Html.AddJavaScript("/Scripts/register.aspx.js"); 
} 
.... 
<div>some html </div> 

도움 주셔서 감사합니다.

편집 =이 질문이 명확하지 않은 경우 설명 만하면됩니다.

"페이지"를 만들 때 html.addJavascript ("filename.js")를 사용하여 디자이너가 사용하고자하는 모든 자바 스크립트 파일을 수집하고이를 사전에 저장합니다. - (1) 파일 - 마지막으로 페이지를 렌더링 할 준비가되면 헤더에 모든 자바 스크립트 파일을 깔끔하게 작성합니다. (2) -이 도우미는 JS를 한 곳에 보관하는 데 도움이되며 디자이너가 자바 스크립트 파일을 여기 저기에 추가하는 것을 방지합니다. 이 작업은 mvc 2.의 Master/SiteMaster Pages에서 제대로 작동하는 데 사용되었지만 면도기로 어떻게이 작업을 수행 할 수 있습니까?

편집 : HTML 도우미 코드 :

.... 
private const string SCRIPTLINK = 
     "<script src=\"{0}\" type=\"text/javascript\"></script>"; 

public static HtmlString RenderScripts(this HtmlHelper helper) { 

    OrderedDictionary scripts = 
     helper.ViewContext.HttpContext.Items["JavaScripts"] as OrderedDictionary; 

    StringBuilder sb = new StringBuilder(500); 
    foreach (DictionaryEntry script in scripts) { 
       sb.AppendFormat(SCRIPTLINK, script.Key); 
     } 
    return new HtmlString(sb.ToString()); 
} 
.... 
+0

어디서 스크립트를 stroring합니까? – SLaks

+0

HtmlHelper 코드가 무엇입니까? –

+0

사전은 어디에 보관합니까? – SLaks

답변

1

슬랙스와 데이빗에게 도움과 조언을 해주셔서 감사합니다. 나는 마침내 작동하는 것처럼 보이는 솔루션을 얻었지만 어떤 것들은 싫어합니다. 더 좋은 방법이 있다면 알려주십시오.

@{ 
    ViewBag.Title = "Child Page"; 
} 

@section Scripts { 

    @{Html.AddJavaScript("/Scripts/register.aspx.js");} 

    } 

<div>some html </div> 

그때와 _ViewStart.cshtml이 있습니다 : 여기

내 자식 페이지입니다

@{ 
    this.Context.Items.Add("JavaScripts", 
     new System.Collections.Specialized.OrderedDictionary()); 

    Layout = "~/Views/Shared/MasterLayout.cshtml"; 
} 

그리고 내 MasterLayout은 다음과 같습니다

<html> 
    .... 
    <title>@ViewBag.Title</title> 
    <head> 
     @{ 
      //core scripts 
      html.AddScript("/scripts/jquery.js"); 
      html.AddScript("/scripts/myLib.js"); 
      .... 
      } 

      @RenderSection("Scripts", required:true) 

      //Have to call render scripts here, but not sure about this? 
      @Html.RenderScripts() 
    </head> 
.... 
</html> 

이 렌더링 않습니다 내 스크립트는 올바른 순서와 위치에 태그를 붙 였지만 클라이언트가 HTML 도우미 renderScript를 호출해야합니다. 자녀 페이지에 있습니다. 괜찮습니다. 템플릿을 만들면 도움이됩니다. 더 좋은 아이디어?

3

그것은 당신의 HtmlHelpers의 코드를 보지 않고 현재의 솔루션을 도와 어렵습니다. 그러나 대신 (그리고 매우 일반적인) 접근 방식은 면도기 섹션을 대신 사용하는 것입니다.레이아웃 페이지에서

는, 그런 다음보기에서 섹션의 내용

@section Scripts { 
    <script src="myscript.js" type="text/javascript"></script> 
} 

자신에게 약간의 입력을 저장하고 심지어 청소기를 확인하려면를 정의 @RenderSection()

<head> 
    <title>Page Title</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> 
    @RenderSection("Scripts", required: false) 
</head> 

를 사용하여 섹션 placholder을 정의 스크립트 태그를 출력하는 HtmlHelper를 만들 수 있습니다.

public static MVcHtmlString AddScript(this HtmlHelper helper, string path) { 
    //create script element html here 
} 

다음 예제와 비슷한 구문 스타일을 사용할 수 있습니다.

@section Scripts { 
    @Html.AddScript("myscript.js") 
} 
+0

방금 ​​귀하의 편집본을 보았습니다. 이렇게하면 중복 된 스크립트 선언이 추가되지 않습니다. –

+0

David에게 감사드립니다. 예, 알겠습니다. 덕분에 도움을 주셔서 감사합니다. 여전히 유용합니다 –

2

코드가 레이아웃 페이지와보기에 별도의 사전을 사용하고 있습니다.

ViewBag 또는 HttpContext.Items에 사전을 저장하십시오.

+0

안녕 슬랙스, 스크립트 파일은 사전에 정적 도우미 클래스에 저장됩니다. –

+1

그렇게하지 마십시오. 한 번에 여러 요청을 받으면 끔찍하게 실패 할 것입니다. – SLaks

+0

oki, 좋은 생각, 항목 컨텍스트를 사용 중입니다. 감사합니다. 면도기 레이아웃을 구성하는 방법에 대한 정보는 무엇입니까? –

관련 문제