c#
  • javascript
  • asp.net-mvc-3
  • model
  • razor
  • 2011-10-02 4 views 13 likes 
    13

    외부 Javascript 파일에서 Model 속성에 액세스 할 수 있습니까?자바 스크립트 파일에서 Model 속성에 액세스 하시겠습니까?

    내가 스크립트 태그 내부 뷰에 직접 자바 스크립트를 넣을 경우 "somescript.js"파일이 작동 표시되지 않습니다

    <script src="../../Scripts/somescript.js" type="text/javascript"> 
    

    내보기에

    var currency = '@Model.Currency'; 
    alert(currency); 
    

    에서 그러나 그것은 작동합니까? 즉, 다음과 같이 외부 스크립트 파일을로드하는 대신 페이지에 항상 코드를 삽입해야합니다.

    @model MyModel; 
    
    <script lang=, type=> 
    var currency = '@Model.Currency'; 
    alert(currency); 
    </script> 
    

    이 방법이 있습니까?

    +0

    당신이 외부 JS가 그들의 브라우저가 동적으로 생성 된 뷰 모델 데이터를 캐시 할 파일을 생성 할 수있는 경우. 아마 네가 원하는게 아니 겠니? – BritishDeveloper

    +1

    최근 [부분 면도기 뷰를 사용하여 외부 JavaScript 파일을 생성하는 방법] [blogpost]에 대한 블로그를 보았습니다. 블로그 포스트는 커스텀 액션 필터를 사용하여 외부 JavaScript 파일에서 Razor 코드를 구문 분석하는 방법을 보여줍니다. ** tl; dr : ** 예, 단순하지만 현명한 해결 방법을 사용하는 것이 가능합니다. [blogpost] : http://blog.mariusschulz.com/generating-external-javascript-files-using-partial-razor-views –

    +0

    http://stackoverflow.com/a/41312348/2592042 여기에서 자세히 설명했습니다. –

    답변

    9

    JS 파일에 MVC/Razor 코드를 구현할 방법이 없습니다.

    HTML의 .cshtml 파일에 변수 데이터를 설정해야합니다. 개념적으로는 OK이며 우려 사항 (서버 생성 HTML 대 클라이언트 스크립트 코드)을 위반하지 않습니다. 이 변수 값은 서버 관심사입니다.

    이 (부분 그러나 좋은) 해결 방법을 살펴보십시오 : Using Inline C# inside Javascript File in MVC Framework 당신이 변수로에 면도칼 태그를 통과 할 수있는 무엇

    +1

    그게 훌륭한 솔루션입니다. 나는 모든 "정적"자바 스크립트 파일에 보관할 수있는 다음 부분 뷰로 "로드"부분을 넣고 그냥로드 할. 좋은 :) – BlueChippy

    2

    . 면도기 파일에서

    > JS 파일에

    var currency = '@Model.Currency'; 
    doAlert(currency); 
    

    >

    function doAlert(curr){ 
        alert(curr); 
    } 
    
    0

    당신은 항상 RazorJs을 시도 할 수 있습니다. 그것은 거의 해결할 수있는 문제가 RazorJs

    1

    JavaScriptModel을 시도 당신의 js 파일에 모델을 사용할 수있는이 아니다 (http://jsm.codeplex.com는) :

    은 그냥 컨트롤러 액션에 다음 코드를 추가합니다 :

    this.AddJavaScriptVariable("Currency", Currency); 
    

    지금 당신은 할 수 있습니다 자바 스크립트에서 "Currency"변수에 액세스하십시오.

    이 변수를 구멍 사이트에서 사용할 수 있어야하는 경우 필터에 넣으십시오. 필터에서 JavaScriptModel을 사용하는 방법의 예는 설명서에서 찾을 수 있습니다.

    9

    jQuery와 함께 데이터 속성을 사용하여이 문제를 해결했습니다. 매우 읽기 쉬운 코드를 만들며 부분 뷰가 필요하거나 ViewEngine을 통해 정적 자바 스크립트를 실행하지 않아도됩니다. 자바 스크립트 파일은 완전히 정적이며 정상적으로 캐시됩니다.

    Index.cshtml :

    @model Namespace.ViewModels.HomeIndexViewModel 
    <h2> 
        Index 
    </h2> 
    
    @section scripts 
    { 
        <script id="Index.js" src="~/Path/To/Index.js" 
         data-action-url="@Url.Action("GridData")" 
         data-relative-url="@Url.Content("~/Content/Images/background.png")" 
         data-sort-by="@Model.SortBy 
         data-sort-order="@Model.SortOrder 
         data-page="@ViewData["Page"]" 
         data-rows="@ViewData["Rows"]"></script> 
    } 
    

    하는 index.js :

    jQuery(document).ready(function ($) { 
        // import all the variables from the model 
        var $vars = $('#Index\\.js').data(); 
    
        alert($vars.page); 
        alert($vars.actionUrl); // Note: hyphenated names become camelCased 
    }); 
    

    _Layout.cshtml (옵션,하지만 좋은 습관) :

    <body> 
        <!-- html content here. scripts go to bottom of body --> 
    
        @Scripts.Render("~/bundles/js") 
        @RenderSection("scripts", required: false) 
    </body> 
    
    관련 문제