asp.net-mvc:jsファイルのかみそり「@」記号


90

私が持って.csHtml使用していますJavaScript関数と-razorファイル@Url.ContentAJAX URLのためのC#関数の内部を。
その関数を.js自分のビューから参照されるファイルに移動したいと思います。

問題は、JavaScriptが@シンボルを「認識」せず、C#コードを解析しないことです。「@」記号を使用してビューからファイル
を参照する方法はあり.jsますか?


2
多分これは(答えを参照)ことができますstackoverflow.com/questions/7892793/ajax-succes-function
アンドリーKhrystyanovich

回答:


87

HTML5 data-*属性を使用できます。divなどのDOM要素がクリックされたときに何らかのアクションを実行するとします。そう:

<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>

次に、別のjavascriptファイルで、DOMを邪魔にならないように操作できます。

$('#foo').click(function() {
    var url = $(this).data('url');
    // do something with this url
});

この方法では、JavaScriptファイルにサーバー側のタグを一切必要とせずに、マークアップとスクリプトを完全に分離できます。


ありがとう。複数の値については頭痛の種になる可能性があると思います。最初は問題を解決できると思いましたが、試してみたところ、コードに非常に多くの参照が見つかり、別の方法を見つけることにしました。
QMaster 2018

19

さて、私はそれを行うかみそりエンジンをnugetで見つけました!意味は@構文を解決します!
名前はRazorJSです。

Nugetパッケージ


2016更新:
パッケージは5年間更新されておらず、プロジェクトサイトリンクは無効です。このライブラリの使用を推奨しなくなりました。


これを調べてもらえますか?stackoverflow.com/questions/27702322/...
iamCR

最初のリンクが壊れている
Memet Olsen

@MemetOlsen、確かに申し訳ありませんが、そのコピーが見つからないため、削除しました:(
gdoronはモニカ

@gdoron、問題ありません。リンク切れについてお知らせしたかっただけです。あなたが述べたように、パッケージは5年間更新されなかったので、とにかくそれを使用することはおそらく悪い考えです。
Memet Olsen

10

この問題に取り組む1つの方法は次のとおりです。

ビューにJavaScript関数を含む部分ビューを追加します。
これにより、@シンボルを使用でき、すべてのjavascript関数がビューから分離されます。


9

次の2つのオプションがあります。

  • 値を関数のパラメーターとして使用し、ビューでワイヤーアップ
  • 名前空間を作成し(JSでは悪い習慣と見なされているパブリックレベルの変数の代わりに)、この値をページの上部に設定して、jsで使用します

例えば:

 var MyCompany = 
 {
   MyProject: {
                  MyVariable:""
               }
  };

そして、あなたの見解で、それを設定してください:

MyCompany.MyProject.MyVariable = @....

更新

カップリングのためにどれも良いことではないのではないかと思うかもしれませんが、それは本当です。jsとビューをカップリングしています。これが、スクリプトが実行されている場所を知らないようにする必要がある理由です。これは、ファイルの最適化されていない編成の症状です。

とにかく、ビューエンジンを作成し、かみそりに対してjsファイルを実行して結果を返す3番目のオプションがあります。これはすっきりしていますが、速度が非常に遅いため、お勧めしません。


1
+1最初の方法を実行します。ビューから初期化関数を呼び出し、必要なすべてのデータを渡します。
Richard Dalton

おかげで、2番目のアプローチは、ビューとjsファイルの結合が悪くありませんか?もっと良い方法はありますか?
gdoronはモニカをサポートしています'10

両方が結合しています。レンダリングする前にjsファイルを処理するビューエンジンを作成しない限り、切り離す方法はありません。私のアップデートをご覧ください。
Aliostad

私が提案したこの方法はどうですか?stackoverflow.com/questions/7902213/...
gdoronはモニカ・支援している

大丈夫ですね。私の+1。部分ビューまたは完全ビューのいずれでも、何も変更されません。それはすべてjsとの結合ビューです。
Aliostad

7

得るために@あなたの.jsに変数を使用すると、グローバル変数を使用しているの.jsファイルを利用しているMVCのビューからその変数の値を設定する必要がありますファイル。

JavaScriptファイル:

var myValue;

function myFunc() {
  alert(myValue);
}

MVCビューファイル:

<script language="text/javascript">
    myValue = @myValueFromModel;
</script>

ビューによって値が設定された後で、関数の呼び出しが発生することを確認してください。


1
関数へのパラメーターとしてmyValueを直接渡すのはどうですか?私はグローバルに依存するよりもparamで明示的に呼び出すことを好みますが、JavaScriptにはそれほど熱心ではないので、グローバルを持つことの重要な側面が不足している可能性があります。
BigMike、2011年

@BigMike:確かに受け入れられます。上記の方法では、変数を複数の関数で同時に使用できるようにするだけですが、パラメーターを使用することも同じです。
Joel Etherton、2011年

説明してくれてありがとう。ある種のjsオブジェクトバージョンのモデルを自動的に(モデルクラスの属性を介して)作成するのは素晴らしいことです。これにより、パターンと完全な名前空間を認識する変数ソリューションが追加されます。大きな問題は、ブラウザに送信された生成されたHTMLにコードを挿入する方法だと思います(<script>タグを介して直接)。私の現在のプロジェクトが終了したらすぐに、これについていくつかの実験を行うと思います。
BigMike、2011年

@BigMike:DataContractJsonSerializerクラス(msdn.microsoft.com/en-us/library/…)を使用すると、これはかなり簡単に実現できます。これは、ビューに解析できるクラスのJSONバージョンを作成します。
Joel Etherton、2011年

4

おそらくこれは正しいアプローチではありません。懸念の分離を検討しています。あなたは持っている必要がありdata injector、あなたの上JavaScriptのクラスとのデータがあり、ほとんどのケースですJSON

scriptフォルダにJSファイルを作成し、この参照をView

<script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script>

さて、JavaScriptあなたの中でリテラルクラスを考えてくださいyourJsFile.js

var contentSetter = {
    allData: {},
    loadData: function (data) {
        contentSetter.allData = eval('(' + data + ')');
    },
    setContentA: function () {
        $("#contentA").html(allData.contentAData);
    },
    setContentB: function () {
        $("#contentB").html(allData.contentAData);
    }
};

クラスも宣言する

public class ContentData
{
    public string ContentDataA { get; set }
    public string ContentDataB { get; set }
}

今、あなたからActionこれを行う:

public ActionResult Index() {
    var contentData = new ContentData();
    contentData.ContentDataA = "Hello";
    contentData.ContentDataB = "World";
    ViewData.Add("contentData", contentData);
}

そしてあなたの見解から:

<div id="contentA"></div>
<div id="contentB"></div>

<script type="text/javascript">
    contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])');
    contentSetter.setContentA();
    contentSetter.setContentB();
</script>

いいね!しかし、それは複雑すぎると思います...私の答えについてどう思いますか?stackoverflow.com/questions/7902213/…。ちなみに、contentADataを書き込んだsetContentBにコピーペーストエラーがある。感謝!
gdoronはモニカをサポートしています

1
@gdoron私を信じて、JSクラスを管理し、分離を検討することは、巨大なプロジェクトがある場合の命の恩人です
Abdul Munim


2

私は通常、モデルプロパティへのアクセスを必要とするJSを関数でラップし、ビューで@somethingを渡します。例えば

<script type="text/javascript">
function MyFunction(somethingPresentInTheView) {
  alert(somethingPresentInTheView);
}
</script>

ビューで私は(ほんの一例)を介して関数呼び出しを追加します:

<input type='button' onclick="MyFunction('@Model.PropertyNeeded')" />

1

私はあなたがそのJSコードをビューに置く必要があることに行き詰まっていると思います。Razorパーサーは、私の知る限り、.jsファイルを調べないため、使用@するものは何も機能しません。PLus、お気づきのように、Javascript自体は、この@文字が理由もなく、たとえば文字列にぶら下がっているのが嫌いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.