2011-12-19 1 views
17

ASP.Net MVC 3 Razorビューエンジンを使用しています。MVC 3レイザービュー:ブールモデル値からJavaScriptを生成

ビューモデルの値に基づいてビュー内にJavaScriptコードを生成する必要があります。使用する必要がある値はブール値です。この例ではIsSetとします。

私がしたいことは、後でスクリプトで使用できるこの値に基づいてJavaScriptブール値を作成することです。

@{ string IsSet = Model.IsSet ? "true" : "false"; } 

...例以下のすべてのために、私は私のビューの上部にあるコードのこのビットを持っていることに留意してください。注:以下のすべての例では、JavaScriptです。

最初の試み ...

var IsSet = @(IsSet); 

が...これは実際に動作する、問題は、それが原因不正な形式にVS 2010で自動書式設定(CTRL + E、D)を壊していますJavaScript - あなたが予想しているように、これは受け入れられません。

第二の試み ...

var IsSet = "@(IsSet)"; 

...私は知っている、JavaScriptは必要なときに、それは私の文字列を自動解析する、賢いです。 Ooopsは文字列型であることを忘れてしまい、空以外のものは真であると評価します。

第三の試み ...

var IsSet = Boolean("@(IsSet)"); 

が....確かに、これは動作します...いや、再びtrueに(悪いパーサを!)、空でない文字列を変換

四最後に ...

var IsSet = "@(IsSet)" === "true"; 

働く何かをしようとするが、それは私には見栄えしません。

私が必要とする場合はこれを使用しますが、最終的には私の質問です。このような状況を処理するにはよりよい方法がありますか?おそらく、私の最初の試みでの望ましくない動作は、Microsoftが見落としているかもしれないものですか?

誰かが私のためにすてきできちんとした5番目の試行を持っているなら、それは良いでしょう。

私にとって重要なことは、VS 2010でのオートフォーマットは

おかげ

についてどのように
+0

私は最初の試みに同意する必要があります - それはあなたがストリングしていないし、最初にブール値であったものをキャストしていないので、私にとって最も自然なように見えます!私はRazor/JSコード全体でこのテクニックを多用していますが、うまくいくようですが、自動フォーマットには何の問題もありませんでしたが、私はReSharperを使って自動的に修正します! –

+0

私はReSharperを使用していますが、私はまだ自動フォーマットの問題にぶつかります。そのため、フォーマット上の問題が発生していないのはわかりません。自動フォーマットと大文字の問題は、HTMLタグ名やJSコード(主にcamelCase、特に自動インデントが行われたときにフォーマッタが起動する)など、小文字のネーミングが適用される場所にPascal-cased Razor変数を配置すると発生しますあなたは別のシナリオを持っていたかもしれませんが、私はあなたが別のシナリオを持っていたかもしれないと思いますか? –

答えて

7

バージョン1これらのうちの1つにすぎないがたとえそれらがすべて仕事をしたとしても、私は投票したいと思っているのです。残念ながら私は自宅でVSを持っていないので、自動フォーマット問題が何であるかを見てみることはできませんが、可能な限り問題を無視して、実際にコードに間違っているものは何もない - それはちょうど混乱しているVSです。

フィフス試み

@{ string IsSet = Model.IsSet ? "true" : ""; } 

var isSet = !!"@(IsSet)"; 
// OR 
var isSet = Boolean("@(IsSet)"); 
...:あなたは、いくつかの他のオプションをしたい場合

(?あなたはVSは、JSのように全体を解釈しようとしていると言っので、それが無効で見つけている)しかし、

"true"と "false"の両方が真であることを既に指摘しているように、文字列値を古いdouble-not-operatorトリックでブール値に強制します。空の文字列) - あなたは "3回目の試み"としてBoolean()を使うことができます。あなたがあなたのページの上部にかなり無意味な機能で終わるが、それは合理的にきちんとした実際の変数の宣言を保持している場合、クライアント側のデバッグよう

第六にしようと...

@{ string IsSet = Model.IsSet ? "true" : "false"; } 

// helper function at the top of your page: 
function bool(strVal) { 
    return strVal === "true"; 
} 

// variable declaration 
var isSet = bool("@(IsSet)"); 

OK、 bool("false")またはbool("true")が表示されます。

セブンス試み...

私は、事前にサーバー側string IsSet = Model.IsSet ? "true" : "false";を作成する余分なステップを好きではありません。私はカミソリの構文を知らないが、あなたはの線に沿って何かを言うことができます。私は仕事に私の「試み」のすべてを期待

var isSet = !!"@(Model.IsSet ? "true" : "")"; 
// OR, better: 
var isSet = !!"@(rzrBool(Model.IsSet))"; 
// where rzrBool() is a server-side helper function (that you would create) 
// which returns "true" or "" 

を、しかし、再び、私はあなたの「最初の試みは、」最良の選択肢だと思います。

+0

ところで、あなたは '@(IsSet)'と言いましたか、または@IsSetと言うことができますか?後者がOKであれば、すべてのバリエーションがきれいになります。 – nnnnnn

+0

まず、自動書式設定の問題は、無効なJavaScriptがあるときに何もしないことです。関数呼び出しなどで閉じ括弧を忘れてしまった場合も同じことが当てはまります。次に、引用符を含む問題を避けるために7番目の文字列を使用する必要があります。 。私は最初のものが最高ですが、自動フォーマットはあまりにもあきらめることが重要であることに同意します。私は同様のことをする他のビューを持っているので、私はブール関数に行くことができます。 – musefan

+1

"5b"があなたにとって最良の選択肢だと思う。サーバー側のコードを変更して "true"または "false"の代わりに "true"または空の文字列を返すと、3回目の試みと同じように機能します(クライアント側またはサーバー側)。 (私の7aに関しては、そうですが、VSを幸せにするために外側をシングルクォートで記述する必要があります。 – nnnnnn

0

壊れないということです。

@Model.IsSet.ToString().ToLower() 
+0

いいえ、JavaScriptブロックでこのダイレクトを使うことを意味すると思いますか?コード、それでは違いはありません。 – musefan

+0

それは私のためにFalseを出力します....もしかしたら、.ToLower()をfalse、var something = @ Model.IsSet.ToString()。ToLower(); –

+0

私の最初の試みと同じように、VS 2010 – musefan

0
var isSet= @((bool)Model.IsSet?"true":"false"); 
+1

これは悪い答えです。最初に、Model.IsSet'をboolにキャストすることはまだありません。第二に、JavaScriptでこれを行うことを意味するならば、私の最初の試み(自動フォーマットブレーク)と同じ問題が残っています – musefan

10

これまでに示されたバージョン(質問と回答の両方)は、私が使用するものです。ここで私はそれを行うだろう方法は次のとおりです。

@model MyViewModel 
<script type="text/javascript"> 
    var isSet = @Html.Raw(Json.Encode(Model.IsSet)); 

    // TODO: use the isSet javascript variable here as a standard boolean value 
</script> 

またはあなたが全体のモデルをJSONエンコードすることができJavaScriptで操作するためにあなたのビューモデルの他のプロパティを必要に応じて:

@model MyViewModel 
<script type="text/javascript"> 
    var model = @Html.Raw(Json.Encode(Model)); 

    if (model.IsSet) { 
     alert(model.FooBar); 
    } 
</script> 
+0

しかし、これはまだJavaScriptの自動フォーマットを壊してしまいます。また、それが立つと、「条件付きコンパイルがオフになっています」というエラーが表示されます...問題のこの部分を解決する括弧が追加されました... @(Html.Raw(Json.Encode(Model.IsSet))); ' – musefan

+2

@musefan、Intellisense in Razor、特にjavascriptと混じっているとひどく吸い込まれる。それは私がずっと前から心配していたことです。うまくいけば、Microsoftは将来のバージョンでそれを修正する予定です。放つべきではない警告を発する。個人的には、XSSの攻撃に脆弱ではない正しいコードを書くことに焦点を当てています。これは、すべてが正しくエンコードされるため、実行時に正しく動作することがわかります。 VSが私にいくつかの完全に有効なコードに関する警告を出すという事実は、VSの設計者がこのコードの作成者として責任を負わなければならないものです。 –

+0

これは良い選択肢です。それはJavaScriptの中に他のサーバー側のコードが混在することなく、最初の1行だけで問題になるオートフォーマットを破るものです。 – nnnnnn

14

私はちょうど同じで苦闘約1時間問題が発生します。私の最終的な解決策は、次のようなものでした。

var IsSet = @(Model.IsSet.ToString().ToLower()); // Inside JavaScript block 

これには追加コードは必要ありません。

+2

これは最初の試みと同じように壊れます。 Intellisenseは変数の初期化のために何かが書かれたことを認識せず、セミコロンに赤い波線を表示します。 –

+0

MVC 4で完璧です。tks – Gandarez

1

方法について:

@Ajax.ToJson(Model.IsSet) 
+0

'@ Ajax.ToJson()とは何ですか?私のインテリセンスやGoogleには表示されません – musefan

0

ここでは、JavaScriptのブロック内で、私が使用するものです。

var someValue; 
@{ var someValue= "someValue= " + Model.SomeValue+ ";"; } 
@someValue 
1
var isSet = /true/i.test('@Model.IsSet'); 
  • シングルライン
  • は間のケースの違いを処理します。ネットとJavaScript
  • (ReSharperのを使用してVisual Studio、およびVisual Studioの)自動フォーマットあなたのJavaScriptに精通している場合には合理的に慣用
  • は、正規表現と
  • 作品
  • 論理エラーにかなり弾力性。それは意図したとおりに行うか、JavaScriptエラー(またはおそらくRazorコンパイルエラー)をスローする必要があります。
0

これは古い質問ですが、回答は特に優雅ではありません。

これらの状況で最も簡単な解決策は、+0を条件に追加することです。暗黙的にboolはintに変換されますが、結果は0または1なので、すぐにif文で再び変換されます。例:次のように変数にブール値を達成することができたの割り当て

// The space is optional 
if (@IsSet +0) { 
    // Do stuff 
} 

// Note the double (not triple) equals, which performs type conversion 
var isSet = @IsSet+0 == true; 

コード作品、あなたには赤い波線を取得していない、とVisual Studioフォーマッタは幸せです。