9

私はasp.netmvcWebサイトを持っており、C#を使用してページの大部分を構築しています。たとえば、ビューモデルからのデータセットを指定してhtmlテーブルを構築しています。

また、これらのテーブルを動的に変更するjavascriptもたくさんあります(たとえば、行を追加します)。

新しい行を追加するためのjavascriptコードは、最初にhtmlテーブルを作成するために使用されるC#の「レンダリング」コードと非常によく似ています。

c#コードを変更して新しいフィールドを追加するたびに、同じことを行うためにjavascriptコードに戻ることを忘れないでください。

ここにもっと良い方法はありますか?

4

3 に答える 3

8

これを行う1つの方法は、サーバー上でWebサービスとしてマークアップを生成するロジックを公開し、ロジックを複製するのではなく、JavaScriptにAJAX呼び出しを介してそのマークアップを取得させることです。

このようにCreateRowして、ページをレンダリングしたときにサーバーで使用したのとまったく同じロジックを実際に呼び出すJavaScriptのメソッドのようなものを呼び出すことができます。

于 2010-01-18T16:19:15.790 に答える
0

Scott Guの記事を見てください:ASP.NET MVC 2:モデルの検証

基本的に、検証はモデルプロパティレベルで定義し、ASP.NETMVC2は適切なクライアント側の検証も自動的に生成できます。

残念ながら、これはすべてをMVCにリファクタリングする必要があることを意味する場合がありますが、ここの多くのpplはおそらくそれをプラスと見なします。

(免責事項:私はASP.NET MVCをまったく使用していません)

于 2010-01-18T18:37:40.137 に答える
0

@AndrewHareによる受け入れられた人気のある回答とは反対です。C#でのみマークアップを実装するよりも(もちろん、javascriptでもその機能が必要な場合)、javascriptでのみマークアップ生成を実装します(そしてHTMLテーブルを構築するためにそれを再利用します)。

なぜなら:

  1. Javascriptは、既にレンダリングされたDOMを変更できるため、HTMLのC#よりも優れています。したがって、Javascriptを使用すると、静的HTMLだけでなく多くのことを実行できます。そして、今は必要ないかもしれませんが、今日では、アプリケーションがリッチインターネットアプリケーションのようになることを目的とした要件は珍しくありません。
  2. AJAX呼び出しは、サーバー側のデータを処理し、それを既存のテーブルの新しい行に変換する最悪のJavascript実装よりも遅くなる可能性が高くなります。また、Javascriptでテーブルを最初から作成するよりも時間がかかります。
  3. サーバー要求が少なくなります(クライアント側の要件が増えますが、通常は問題ありません)。
  4. 本当に素晴らしいテーブル(およびそれ以上)を作成する非常に優れたJavascriptフレームワークがいくつかあります。

ASP.NET MVCには、コントロールにHTMLヘルパーを使用する方法に関する優れた例がたくさんあり、クリーンで高速な開発が可能であることを私は知っています。しかし、とにかくJavascript関数を作成することになった場合は、関心の分離をもう一度検討し、Javascriptに固執して、HTMLヘルパーの重複を破棄する必要があると思います。

すでに行を作成している場合は、Javascript関数を拡張してテーブル全体を作成するので、それほど難しいことではないと思います。データをJavascriptに渡し、Javascriptにすでにある関数「createRow」を使用する方法のアイデアを次に示します。

<script>
    var data = [];
    <% foreach (var item in Model) { %>
        data.push({
            Id: <%= Html.Encode(item.Id) %>
            , Title: <%= Html.Encode(item.Title) %>
        });
    <% } %> 
    createTableHeader();
    for (var i = 0; i < data.length; i++) {
        createRow(data[i]);
    }
    createTableFooter();
</script>
于 2010-12-22T05:45:10.547 に答える