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

    外部JavascriptファイルのModelプロパティにアクセスできますか?javascriptファイルのModelプロパティにアクセスしますか?

    私は、スクリプトタグ内のビューに直接JavaScriptを置けば「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ファイル)に設定する必要があります。これは概念的には問題ありませんが、懸念事項の分離には影響しません(サーバー生成HTML対クライアントスクリプトコード)これらの変数値はサーバーの懸案事項です。

    この(部分が、素敵な)回避策を見てみましょう:Using Inline C# inside Javascript File in MVC Framework

    +1

    それは素晴らしい解決策です。私はすべての "静的な" javascriptをファイルに保存して、部分的なビューに "vars"の部分を入れてロードするだけです。ニース:) – BlueChippy

    2

    あなたは何ができるかを変数としてかみそりのタグを中に通過しています。 JSファイルで、かみそりのファイルに

    >

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

    >

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

    あなたはいつもRazorJsを試みることができます。

    ちょうどあなたのコントローラのアクションに次のコードを追加します:かなりJavaScriptModel(http://jsm.codeplex.com)を試してみてください、あなたのjsファイルにRazorJs

    1

    をモデルを使用することができない解決します

    今することができます
    this.AddJavaScriptVariable("Currency", Currency); 
    

    JavaScriptの変数 "Currency"にアクセスします。

    この変数をホールサイトで使用できるようにするには、フィルタに配置します。フィルタからJavaScriptModelを使用する方法の例は、ドキュメントにあります。

    9

    データ属性とjQueryを使用してこの問題に取り組みました。これは非常に読みやすいコードを作成し、部分的なビューやViewEngineによる静的なjavascriptの実行を必要としません。 JavaScriptファイルは完全に静的で、通常はキャッシュされます。

    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> 
    
    関連する問題