7

ASP.NET MVC3アプリケーションがあり、アクションによって、後続のAJAX要求で使用できるようにするIDのリストが生成されます。これは、バックグラウンドで長いプロセスを実行してポーリングできるようにするためです。IDのリストは、この長時間実行されるプロセスに必要な入力です。リストが非常に長くなり、IEで問題が発生する可能性があるため、これらをパラメータとしてURLに渡したくありません。

私のコントローラー

public ActionResult Run()
{
    List<MyObjs> objs = _db.MyObjs.ToList<MyObjs>();

    string uniqueId = Guid.NewGuid().ToString();
    ViewData["UniqueID"] = uniqueId;
    TempData["ObjIdList" + uniqueId] = String.Join(",", objs .Select(o => o.ObjID).ToArray<int>());

    return View(objs);
}            

public void StartProcess(string uid)
{
    string ids = TempData["ObjIdList" + id].ToString().Split(',');
    ...        
}

私の見解

var uniqueId = '@ViewData["UniqueID"]';

$(document).ready(function (event) {
    $('#startProcess').click(function () {
        $.post("/Scheduler/StartProcess", { uid: uniqueId }, function () {
            getStatus();
        });
        event.preventDefault;
    });
});

function getStatus() {
    var r = new Date().getTime(); // cache killer for IE
    var url = '/Scheduler/GetCurrentProgress/' + uniqueId + "?r=" + r;
    $.get(url, function (data) {
        if (data != "100") {
            $('#status').html(data);
            setTimeout(function () { getStatus(); }, 100);
        } else {
            $('#status').html("Done");
        };
    });
}

これは、1人の同時ユーザーがいる私のラップトップではありますが、私の最初のテストでは機能しています。これは安全ですか、それともこのデータを渡すためのより良い方法がありますか?

4

3 に答える 3

11

ブランドン

TempDataはViewDataに似ていますが、2つの連続するリクエストに対して持続するため、2つの異なるコントローラーアクション間でデータを渡す場合などに役立ちます。

ジェイソンC

MVCのTempDataは、実際には取得されるまで存続します。参考までに、Tempdataは実際にはユーザーのSessionStateに格納されるため、ViewDataというよりもSessionDataに似ています。

私の質問の回答の1つから取得-MVC3コントローラーのアクション結果'覚えている'渡されたID

基本的に、TempDataは、コントローラーへの2つの連続する要求間の通信に使用されるSessionプロパティ(SessionStateに格納される)のようなものです。あなたの場合、これが良いまたは悪い習慣であるかのように、データをtempdataに渡すことは完全に問題ないと思いますが、それらは他のオプションであり、それらの間の隠しフィールドです。見るべきもう一つの良いリンクはASP.NETMVC-TempData-良いまたは悪い習慣です

于 2012-10-04T23:20:33.673 に答える
3

の有効期間TempDataは非常に短いです。現在のリクエストから次のリクエストまで。TempDataはSession、舞台裏でデータを保存するために使用しています。ただし、ライフタイムは通常のセッション変数よりも短く、それは後続のリクエストまでです。

TempDataを設定した前回の呼び出しの直後にajax呼び出しを行うことが確実な場合は、それを使用できます。より詳細な制御が必要な場合は、変数に保持し、Sessionn回必要な場所で使用した後、セッション変数を破棄できます。

于 2012-10-04T23:27:12.180 に答える
0

TempDataは、ASP.NETMVCのコントローラー間で値を渡す場合にのみ使用してください。

于 2012-10-05T05:27:19.333 に答える