0

だから私は問題を抱えています...私は私のウェブアプリの関心事を分離しています:かみそりのページのHTMLとjsファイルのJS。私の問題は、サーバーからビューモデルに渡されたコントローラーからのデータを選択リストのオプションとして使用したいという事実にあります。問題は、jsをHTMLから分離し、jsファイル内のRazorにアクセスできないという事実にあります。

ビューモデルに含まれるアイテムのリストがあります...

public List Stuffs { get; set; }

私はそれをサーバー側でjsonエンコードし、循環参照を処理するようにしているので、次のようになります [{"id":1,"name":"blah"},{"id":2,"name":"blah2"},{"id":3,"name":"blah3"},{"id":4,"name":"blah4"}]

問題は、関心の分離を維持したいので、その配列をjsファイルに入れて、ノックアウトを使用して選択リストにバインドできるようにするにはどうすればよいですか?私は間違いなくサーバーへの別の往復をしたくありません。

4

2 に答える 2

2

したがって、次のようなビューがあるとしましょう。

<div> (Some stuff) </div>

<script type="text/javascript">
    var initialData = //Your JSON
<script>

そして、JavaScript(ビューの下にリンクしているため、その後にロードされる)には、次のようなものがあります。

var data = initialData || {} //Or some other default value, in case initialData wasn't set

これは、設定されている場合はロードされ、initialData設定されていない場合は何も使用されません (または定義されたデフォルト)。疎結合。

もちろん、より複雑なデータでは構造を標準化する必要がありますが、これは基本的に、JavaScript ファイルに密に結合することなく、カミソリで生成されたビューからデータを取り込むことができる 1 つの方法です。

于 2012-08-01T20:48:26.100 に答える
1

Javascript ファイルには、インスタンス化可能な関数の形式でビュー モデルが含まれていますか。たとえば、次のようなものです。

function MasterVM(data)

またはオブジェクトリテラル、例えば

var masterVM = { ...

? 私はインスタンス化可能なビュー モデルを使用する傾向があります (一部には、マッピング プラグインを使用してビュー モデルの階層をチェーン ダウンするためです。トップ レベルのビュー モデルがその子を構築します)。 MVC ビュー モデルからレンダリングされた JSON を含むモデル。

var masterVM = new MasterVM(@(Html.Raw(JsonConvert.SerializeObject(Model.ProductViewModel))));

または、公開モジュールによって Knockout ビューモデルを「所有」して、次のように初期化することもできます。

productModule.init(@(Html.Raw(JsonConvert.SerializeObject(Model.ProductViewModel))));

次に、productModule は、ビュー モデルとサーバーの間の仲介、ダーティな状態の監視などの他のことも担当します。

また、ブラウザにキャッシュさせたい再利用可能なオプションの大量のセットを調達している場合、サーバーへの別のラウンドトリップを行うことは必ずしも悪いことではありません。そうであれば、一般的に使用されるすべてのオプションを含む大きなオブジェクト リテラルを発行する MVC コントローラーが必要になる場合があります。これは、複数の選択で「オプション」プロパティとして使用できます。ただし、オプションが特定のビュー モデルに固有のものである場合、それらはビュー モデルの一部である必要があると思います。

于 2012-08-02T06:36:12.250 に答える