2009-07-28 17 views
33

最近、ASP.NET MVCとJavascript/jQueryを使っていましたが、私はいつも渡す必要がある方向に向かっているようですいくつかの動的な値を "私のjavascriptに"。スクリプトは、右のページにあるとき、私はこのような何かをやった:asp.net-mvcからjavascriptにデータを渡すためのベストプラクティス

var isEditable = <%=ViewData["editable"]%> 

が、私はこれが&素早く簡単に、ちょうど私がHTMLに値を挿入したいようなものですかね。しかし、これはにおいがする。本当に、本当に悪い。また、Visual Studioのインテリセンスとコードの書式設定が壊れ、スクリプトが読みにくくなってしまいます。

それは別の解決策は、それがそのままスクリプトを保持しますので、これはおそらくはるかに優れて

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

...隠しフィールドに自分のデータを渡し、そのJavascriptの参照を持っているだろう私に発生したので、それを外部の.jsファイルに移動することができます。しかし、この解決策についての何かが理想的ではないように思われます。それとも私だけですか?

誰もあなたのスクリプトにデータを渡すためのベストプラクティス&ソリューションをお勧めできますか?私のスクリプトが最初にコントローラからのビューデータに大きく依存してしまうと、私は間違った方向に向かいましたか?

+1

モデルからAJAXコントローラのデータストアにデータを「プル」するのはどうですか? – Janie

+1

私は、AJAXは、私が言及しているケースでは過度の攻撃になるだろうと思っています...私のスクリプトは、コントローラ/モデル(初期ページの実行時に既に存在しているデータ)から数ビットのデータを知る必要があります別のネットワークコールを発行するには、コントローラーが少し多いようです。 –

答えて

11

私は時々、JSONシリアライザを経由してページに設定オブジェクトを書き込むことによって、私のページにデータを渡す:あなたはToJsonメソッドを自分で書く必要があり

var pageConfig = <%= ServerConfig.ToJson() %>; 

。これにより、ページの状態がきちんと保持され、サーバー値を挿入する場所が1つだけになります。ここからのすべてが純粋なjavascriptです。あなたの例では、あなたがして行うことができます:

var isEditable = pageConfig.isEditable; 

も、外部のjsファイルで、pageConfigがグローバルである場合。しかしその場合は、適切に名前を付けてください:MY_APP.pageConfig

+0

これはチャイシャビリティに影響しませんか?少なくとも各ページGETは別のページを返すかもしれません(別の設定)。プロキシサーバーのキャッシュを考えると、各ユーザーごとにそのページのバージョンが異なります。それはまったく心配ですか? –

+0

これは興味深いオプションですが、このServerConfigクラスの実装方法を正確に理解できていません。実際、各ページGETは別のデータセットを返す可能性があるので、最終的に各ページのViewDataからpageConfigを設定する必要はありませんか?それにもかかわらず、あなたの他の提案は、私が間違いなく試してみたい(Jsonとグローバルな変数) - ありがとう! –

+0

@Kurt - ええ、あなたはViewDataからそれを構築しなければならないと思います(おそらく、匿名型として)。私はあなたがViewDataを取り除くことができるわけではありませんでしたが、ページ上にサーバーデータを注入している場所の数を制限することができます。 –

0

あなたはその情報を何らかの方法で注入しようとしています。そして、IMO、あなたの最初の例は、2番目の例と実際には違いはありません。

別の解決策は、オプションオブジェクトを受け入れるJSクラス(またはプロトタイプ?)を持つことです。それは間違いありませんが、あなたが与えた例と実際には違いはありません。しかし、まだ、あなたはこのようにしたいと思うかもしれません。

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

@çağdaşは良い点があると思いますが、サーバー側もチェックしてください。フィールドを「読み取り専用」に設定すると、ユーザーがそのフラグを変更したり、読み取り専用フィールドを変更したり、送信したりするのを防ぐことはできません。

0

Ajaxのビジネス全体は、のロードの情報を非同期にします。あなたがAjaxの仕事をしている(情報を読み込んで変数に保存している)なら、それはそこから力を得ています。なぜJQueryを試してみて、Ajaxを使うのか、Get関数を使ってコンテンツを動的に読み込まないのですか?それはあなたのページの読み込みを速くするのに役立ちます。

関連する問題