50

かみそりを使用してc#コードでsrcript変数を設定できるように、誰かが以下のコードをフォーマットできますか?

以下は機能しません。誰かが簡単に作成できるようにしています。

@{int proID = 123; int nonProID = 456;}

<script type="text/javascript">
    @{

     <text>  

    var nonID =@nonProID;
    var proID= @proID;
    window.nonID = @nonProID;
    window.proID=@proID;

    </text>
}
</script>

設計時エラーが発生します

ここに画像の説明を入力

4

14 に答える 14

43

カミソリ ページの結果の出力を確認する必要があります。server-side実際には、 andによって実行されるものを知る必要がありclient-sideます。これを試して:

@{
    int proID = 123; 
    int nonProID = 456;
}

<script>

    var nonID = @nonProID;
    var proID = @proID;
    window.nonID = @nonProID;
    window.proID = @proID;

</script>

出力は次のようになります。

ここに画像の説明を入力

使用している Visual Studio のバージョンに応じて、カミソリを使用したビューのデザイン時のいくつかのハイライトを示しています。

于 2013-02-14T01:51:45.367 に答える
21

ビューの作業中にかみそりの構文エラーが問題になる可能性があるため、それらを避けたい理由は完全に理解できます。他のいくつかのオプションを次に示します。

<script type="text/javascript">
    // @Model.Count is an int
    var count = '@Model.Count';
    var countInt = parseInt('@Model.ActiveLocsCount');
</script>

引用符は区切り文字として機能するため、剃刀パーサーは満足しています。しかしもちろん、最初のステートメントで C# の int が JS 文字列になります。純粋主義者の場合、2 番目のオプションの方が適している場合があります。

かみそりの構文エラーなしでこれを行うためのより良い方法、特に var の型を維持する方法を誰かが持っているなら、ぜひ見てみたいです!

于 2013-04-17T18:30:29.710 に答える
20

これが私が問題を解決した方法です:

@{int proID = 123; int nonProID = 456;}

<script type="text/javascript">
var nonID = Number(@nonProID);
var proID = Number(@proID);
</script>

それは自己文書化されており、テキストへの変換やテキストからの変換は必要ありません。


Number()注: オブジェクトを作成しないで関数を使用するように注意してください。new Number()正確に等しい演算子は、自明ではない方法で動作する可能性があるためです。

var y = new Number(123); // Note incorrect usage of "new"
var x = new Number(123);
alert(y === 123); // displays false
alert(x == y); // displays false
于 2013-10-02T00:01:39.110 に答える
13

私はバグを回避するためのいくつかのアプローチを見てきました。そして、速度のために何が機能するかを確認するためにいくつかのタイミングテストを実行しました ( http://jsfiddle.net/5dwwy/ )

アプローチ:

  1. 直接割り当て

    このアプローチでは、剃刀の構文が変数に直接割り当てられます。これがエラーをスローするものです。ベースラインとして、JavaScript 速度テストは単純に数値を変数に直接代入します。

  2. Number コンストラクターを通過する

    このアプローチでは、`Number(@ViewBag.Value)` のように、`Number` コンストラクターへの呼び出しで剃刀構文をラップします。

  3. ParseInt

    このアプローチでは、かみそりの構文を引用符で囲み、「parseInt」関数に渡します。

  4. 値を返す関数

    このアプローチでは、単にレーザー構文をパラメーターとして受け取り、それを返す関数が作成されます。

  5. 型チェック機能

    このアプローチでは、関数はいくつかの基本的な型チェック (基本的には null を探します) を実行し、null でない場合は値を返します。

手順:

上記の各アプローチを使用して、afor-loopは各関数呼び出しを 10M 回繰り返し、ループ全体の合計時間を取得します。次に、その for ループを 30 回繰り返して、10M アクションあたりの平均時間を取得します。次に、これらの時間を相互に比較して、どのアクションが他のアクションよりも速かったかを判断しました。

JavaScript が実行されているため、他の人が受け取る実際の数値は異なることに注意してください。ただし、重要なのは実際の数値ではなく、数値が他の数値とどのように比較されるかです。

結果:

直接割り当てアプローチを使用すると、1,000 万件の割り当てを処理する平均時間は 98.033 ミリ秒でした。コンストラクターを使用すると、Number10M あたり 1554.93ms が得られました。同様に、parseIntメソッドには 1404.27ms かかりました。2 つの関数呼び出しは、単純な関数で 97.5 ミリ秒、より複雑な関数で 101.4 ミリ秒かかりました。

結論:

理解するのに最もわかりやすいコードは、直接代入です。ただし、Visual Studio のバグのため、これはエラーを報告し、Intellisense で問題を引き起こし、漠然と間違っているという感覚を与える可能性があります。

最速のコードは単純な関数呼び出しでしたが、わずかな差でした。これ以上の分析は行っていないため、この差に統計的有意性があるかどうかはわかりません。型チェック関数も非常に高速で、直接割り当てよりもわずかに遅く、変数が null である可能性が含まれています。ただし、パラメーターが未定義の場合 (かみそり構文では null)、基本的な関数でさえ未定義を返すため、実際には実用的ではありません。

Razor 値を int として解析し、コンストラクターを介して実行すると、直接割り当てよりも 15 倍遅くなり、非常に遅くなりました。ほとんどの場合、Numberコンストラクターは実際には内部で を呼び出しています。parseIntこれにより、単純な よりも時間がかかる理由が説明されますparseInt。ただし、外部で定義された (つまり、ファイルまたはアプリケーションの別の場所で) 関数を実行する必要がなく、Numberコンストラクターが整数から文字列への目に見えるキャストを実際に最小限に抑えることで、より意味のあるものになるという利点があります。

要するに、これらの数値は 1,000 万回の反復を実行して生成されたものです。単体での速度は計り知れないほど小さい。ほとんどの場合、コンストラクターを介して単純に実行することNumberは、最も遅いにもかかわらず、最も読みやすいコードになる可能性があります。

于 2014-03-14T22:26:04.377 に答える
10
@{
int proID = 123; 
int nonProID = 456;
}

<script>

var nonID = '@nonProID';
var proID = '@proID';
window.nonID = '@nonProID';
window.proID = '@proID';

</script>
于 2014-04-28T13:17:28.253 に答える
3

次のようなことをするとうまくいきます:

var proID = @proID + 0;

次のようなコードを生成します。

var proID = 4 + 0;

確かに少し奇妙ですが、少なくとも偽の構文エラーはもうありません。残念ながら、VS2013 でもエラーが報告されているため、(まだ) 適切に対処されていません。

于 2013-12-12T15:08:58.587 に答える
3

私はこのアプローチを検討してきました:

function getServerObject(serverObject) {
  if (typeof serverObject === "undefined") {
    return null;
  }
  return serverObject;
}

var itCameFromDotNet = getServerObject(@dotNetObject);

私には、これはJS側でより安全になるようです...最悪の場合、null変数になってしまいます。

于 2014-02-25T20:55:40.320 に答える
3

@(...)教訓としての答えではありません。これも私を悩ませていました-そして、ゼロを前に保留して構文を使用することで解決策があると思いました。つまり、コードは次のようになります。

var nonID = 0@(nonProID);
var proID = 0@(proID);

次のような出力を取得します。

var nonId = 0123;

私が気付いていなかったのは、これが JavaScript (バージョン 3) が 8 進数/基数 8 の数値を表す方法であり、実際に値を変更していることです。さらに、"use strict";コマンドを使用している場合、8 進数が削除されているため、コードが完全に壊れます。

私はまだこれに対する適切な解決策を探しています。

于 2013-07-17T14:35:39.847 に答える
1

コードと混合したコードfunction本体の構文エラーを解決するために非常に単純なものを使用します;)JavaScriptRazor

function n(num){return num;}

var nonID = n(@nonProID);
var proID= n(@proID);
于 2016-08-12T16:10:00.837 に答える