3

私はデータテーブルチャートを使用しています。モデルを介して標準データを返したいのですが、奇妙な理由でそれができず、コントロールは Json でのみ機能するようです。多分それは私の理解だけです。しかし、この時点で私は完全に迷っています。

私がやりたいことは、実際には(理論的には)非常に単純です。

アクション結果 1 は、Json の結果としてビューにページングされたデータを持つテーブルを返します。これは、データ テーブルが必要とするためです。これはうまくいきます。

これに対するコントローラーのアクション結果は次のとおりです。

public ActionResult AjaxVitalsHandler()
{
    return PartialView();
}

[HttpPost]
[AccessRequired(AccessFeature.Vitals, AccessLevel.Read)]
public ActionResult AjaxVitalsHandler(JQueryDataTableParamModel param)
{
    int start = param.iDisplayStart;
    int perPage = Math.Min(param.iDisplayLength, 100);
    int currentPage = (start / perPage) + 1;
    int id = _accountSession.CurrentUserId;

    //...Bunch of code here to do basic queries and get the data...All working fine.

    return Json(new
    {
         sEcho = param.sEcho,
         iTotalRecords = model.TotalItemCount,
         iTotalDisplayRecords = model.TotalItemCount,
         aaData = result
    });
}

対応する部分ビューを次に示します (これは、RenderAction を使用してメイン ビューに読み込まれた部分ビューであり、特別なことは何もありません)。

<table class="table table-striped table-bordered table-hover" 
                       id="vitalsTable"
                       data-request-url="@Url.Action("AjaxVitalsHandler")">
    <thead>
        <tr>
            <th class="hidden-480">Date</th>
            <th class="hidden-480">Weight (kg)</th>
            <th class="hidden-480">Height (cm)</th>
            <th class="hidden-480">BMI</th>
            <th class="hidden-480">B/P</th>
        </tr>
    </thead>
</table>

最後に、対応する DataTables コード (何らかの奇妙な理由で、メイン ビューではなく部分ビューに配置するとエラーが発生します (私の質問ではありませんが、とにかく):

<script>
    $(document).ready(function ()
    {
        var urlRequest = $('#vitalsTable').data("request-url");

        $('#vitalsTable').dataTable({
            "bSort": false,
            "bServerSide": true,
            "sAjaxSource": urlRequest,
            "sServerMethod": "POST",
            "bProcessing": true,
            "bFilter": false,
            "aLengthMenu": [[10], [10]],
            "aoColumns": [
                { "mDataProp": "VitalsDate" },
                { "mDataProp": "weight" },
                { "mDataProp": "height" },
                { "mDataProp": "bmi" },
                { "mDataProp": "bp" },
            ]
        });
    });
</script>

アクションの結果 2 は、別のビューに同じデータを持つグラフを Json の結果として返します。これは正常に機能しますが、データの最初のページに対してのみです。

これに対するコントローラーのアクション結果は次のとおりです。

    public ActionResult LoadVitalsChartData2()
    {
        return PartialView();
    }

    //[HttpPost]
    [AccessRequired(AccessFeature.Vitals, AccessLevel.Read)]
    public JsonResult LoadVitalsChartData()
    {
        int id = _accountSession.CurrentUserId;


        //Bunch of code here to retrieve the data...Problem here.
        //There seems to be no way to sync the Ajax call back to that it refreshes
        //the data here too.
        //Ideally what I want is that when the page button is pressed, it reloads this
        //chart too and passes to it the relevant columns of data for plotting.
        //Presently I can only get it to do the first page.
        //The queries work, but how do I pass the relevant page data from the above
        //action result so I am not just getting the first page of data every time.

        return Json(new
        {
            weightData = weightResult,
            xLabels = xAxisResult,
            heightData = heightResult

            //There is security issues around AllowGet inside a post method.
            //I would like to fix this but it is also not my question.
        }, JsonRequestBehavior.AllowGet);
    }

対応する部分ビューを次に示します (これは、RenderAction を使用してメイン ビューに読み込まれた部分ビューであり、特別なことは何もありません)。

    <div id="VitalsChart" class="chart"
             data-request-url="@Url.Action("LoadVitalsChartData")">
    </div>

最後に、これはサイトからコピーして貼り付けたもので、わずかに変更しただけの対応するチャートコードです。完全なコードをここに表示したい場合は、多くの読み物がありますが、どこにも表示されませんページングを行うには:

        Charts.initCharts();

明らかに、現在表に表示されているデータをグラフに表示したいと考えています。つまり、テーブルに 10 個のアイテムが 10 個ずつページングされている場合、テーブルに 20 ~ 30 個のアイテムが表示されている場合、チャートにはそれらのアイテムのデータが表示されます。最初の項目 1 から 10 のデータのみが表示されます。チャート自体はページングを処理する必要はありません。表示する 10 項目とテーブルがいつ更新されるかを知るだけで済みます。これはすべて、テーブルに送信されたデータとそのページング イベントから入手できます。

では、これをテーブルから取り出してチャートに渡すにはどうすればよいでしょうか。

共有できるように、データを何らかの配列に抽出しようとしました。フロートチャートはこれを好みません。また、データを共通のアクション メソッドに抽出し、それを別の actionresult に渡そうとしましたが、その方法がわかりません。

クラスを定義してキャストすることにより、すべてのデータを匿名型から標準クラス型に変換しようとしました。しかし、私はまだエラーが発生します。

これは以前にも行われています。ページ テーブルと、そこに表示されるデータに対応するグラフ。C# MVC4 でこれを行うのが非常に難しいのはなぜですか。

Jsonの代わりに標準データで上記を使用できる方法があれば、解決策を知っているので笑っています。実際、私は解決策を持っています。データをクエリするときは、ページング ラッパーでラップして、必要なデータのみが返されるようにします。次に、ページ番号のみを Paging ラッパーに渡す同じデータセットの各アクション結果で 1 つずつ、2 つのクエリを実行します。残念ながら、これは EF と Linq を使用した標準の C# と Razor の場合です。私の素晴らしいコントロールには Json が必要です。これはずっと簡単なはずですが、何が欠けているのかわかりません。

これ以上のコードを投稿するのは難しいです。投稿が非常に長くなるように、さまざまな方法を試しました。しかし、孤立したものやその一部は、問題を混乱させるだけです。

最後に:これを行う方法の手がかりを得て、進歩を始めましたが、データテーブルサイトで探している例は良くありません. これは、これまでに正しく機能していない私の多くの試みの1つです(JavaScriptエラーではなく、標準のデータテーブルエラーが発生するだけです):

    $('#vitalsTable').live('page', function ()
    {
        var tbl = $('#vitalsTable').dataTable(
            {
                "aoColumnDefs": [{
                    "aTargets": [0],
                    "mData": function (source, type, val)
                    {
                        return "Hello";
                    }
                }]

            });

        alert("Data ==> " + tbl);

        Charts.initCharts();
    });

私が実際にやろうとしているのは、ページが変更されたときにデータの列を取得し、このデータをグラフにプロットすることです。このページには 10 個のアイテムが含まれています。したがって、プロットのためにチャートに渡すことができる 10 個のアイテムを含むデータの列が必要です。

コードの別のスニペットは、上記のようにページ変更イベントを検出する必要があることを示唆しており、その前にこれを行う必要があります。

    var my_chart = $.plot($("#vitalsTable"), [{}]);

次に、その中で次のようなことを行う必要があります。

    my_chart.setData([new_data_set]);
    my_chart.draw();

しかし、繰り返しますが、それを機能させる方法がわかりません。

助けてくれてありがとう。

4

1 に答える 1

1

これは私にとって本当に驚くべきことです。SO は素晴らしいリソースであり、私はそれが大好きです。しかし、SO ユーザーが答えなかった問題に出くわしたのはこれが初めてです。とにかく、ついに8日後、私は自分の質問に対する答えを見つけました. だから私はいつもここに戻ってくるので、将来自分自身の参考のためにここにポップするつもりです. S/O は私の新しいコーディングのバイブルのようなものです。

基本的に、コントローラーは問題ではありませんでした。ビューでさえ問題ではありませんでしたが、ビューで jQuery を実行していた方法に問題がありました。

本質的に新しいイベント ハンドラーをデータ テーブルに追加する他のフォーラムで、このようなことを行うように勧められました。

$('#vitalsTable').live('page', function ()
{
    var tbl = $('#vitalsTable').dataTable(
        {
            "aoColumnDefs": [{
                "aTargets": [0],
                "mData": function (source, type, val)
                {
                    return "Hello";
                }
            }]

        });

    alert("Data ==> " + tbl);

    Charts.initCharts();
});

私のdatatablesコードのこのコードの上に、私は次のようなものを持っていました:

<script>
$(document).ready(function ()
{
    var urlRequest = $('#vitalsTable').data("request-url");

    $('#vitalsTable').dataTable({
        "bSort": false,
        "bServerSide": true,
        "sAjaxSource": urlRequest,
        "sServerMethod": "POST",
        "bProcessing": true,
        "bFilter": false,
        "aLengthMenu": [[10], [10]],
        "aoColumns": [
            { "mDataProp": "VitalsDate" },
            { "mDataProp": "weight" },
            { "mDataProp": "height" },
            { "mDataProp": "bmi" },
            { "mDataProp": "bp" },
        ]
    });
});
</script>

実際には、変更する必要があったのは、すぐ上のコードを以下のコードに変更することだけでした。

<script>
    $(document).ready(function ()
    {
        var urlRequest = $('#vitalsTable').data("request-url");

        $('#vitalsTable').dataTable({
            "bSort": false,
            "bServerSide": true,
            "sAjaxSource": urlRequest,
            "sServerMethod": "POST",
            "bProcessing": true,
            "bFilter": false,
            "aLengthMenu": [[10], [10]],
            "fnDrawCallback": function (oSettings)
            {
                Charts.initCharts(oSettings);
            },
            "aoColumns": [
                { "mDataProp": "VitalsDate" },
                { "mDataProp": "weight" },
                { "mDataProp": "height" },
                { "mDataProp": "bmi" },
                { "mDataProp": "bp" },
            ]
        });
    });
</script>

これを行ったら、Charts.initCharts 関数を介してデータを取り込むクライアント側の chart.js ファイルを微調整するだけで、すべてうまく機能しました。

後で匿名型に問題が発生したので、C# が舞台裏で行っているように、それらを適切なクラスに置き換えてみました。しかし、解決するのはこれよりもさらに簡単であることがわかりました。私のヒントは、ビュー、コントローラー、およびクライアント側の chart.js で変数の大文字化に注意してください。それらは正確に対応する必要があります。それを見つけるのに2日間いじりました。単純な変更に最も時間がかかる場合があるのは驚くべきことです。

これを見ている他の人が役に立つことを願っています。そうでない場合は、コメントを投稿してください。回答を試みます。

于 2013-06-07T01:07:36.047 に答える