1

「編集」リンクを持つユーザーの簡単なリストを想像してみてください。[編集]をクリックすると、選択したユーザーの詳細を示すダイアログボックスが開きます。「詳細」ポップアップは部分的なビューです。

JQueryダイアログウィンドウで部分ビューを開くと、部分ビューがキャッシュされるという問題があります。

私の部分的なビュー(キャッシュの問題を解決しようとしたものの1つとしてOutputCache属性に注意してください):

    [HttpGet]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public PartialViewResult EditUser(int id)
    {
     var userList = userRepository.GetByRole(id);

     return PartialView("EditUser",userList);
    }

上記のPartialViewは、次のJavascript関数から要求およびロードされます。

function editUserOpen(id) {

    $.ajaxSetup({  ///// Another thing I tried to solve caching
        cache: false
    });

    var url = "/User/PartialViewResult/" + id;

    $('#user-wrap').empty().load(url, function () {

    $("#dialog-edit-user").dialog({
        title: "Edit User",
        autoOpen: false,
        height: 300,
        width: 500,
        modal: true
    });

        $('#dialog-edit-user').dialog("open");
    });
}

上に示したように、「dialog-edit-user」(「dialog-add-user」および「dialog-delete-user」とともに)は、DOMの「user-wrap」Div内にあります。

機能的にはすべて機能しますが、ダイアログを開いたら、キャンセルしてから他のユーザーのダイアログを開いてみてください。ページが更新されるまで、ダイアログには常に最初に表示されたダイアログの情報が含まれます。キャッシュの問題を理解しましたが、それを解決する方法が足りなくなりました。

可能であれば、$。ajax({cache:false;})。html(content)には近づかないようにしたいと思います。.load()よりもはるかに遅いように思えます。

4

2 に答える 2

6

これが私が発見したものです。

上に示すように、JQueryダイアログが.dialog()で初期化されるたびに、ポップアップになるdivがDOMから取り出され、ページの下部に移動されます。DialogDivを別のDivの子にすることはできません。私の例では、次のようになりました。

<div id="user-wrap">
  <div id="dialog-edit-user">  /// <--- Jquery dialog div

  </div>
</div>

ダイアログを他のdivでラップすることはできません。

最初のクリック後、ダイアログが表示されると、JQueryはページの下部に重複するDivの蓄積を開始します。$("#").dialog('open')プログラマー/ユーザーにキャッシュの問題であると思わせるたびに、累積された複製の一番上のDIVを開きます。

したがって、解決策は、イベント時にJQueryによって作成されたdivをページの下部から削除するか、 JQuery /関数.dialog({close: }を使用して親ラッパーDIVに戻すことです。.append().appendTo()

これが、同様の問題に遭遇した次のプログラマーに役立つことを願っています。

于 2012-07-18T01:19:02.717 に答える
0

URLにランダムなハッシュを追加して、一意に保ちます。

...
var url = "/User/PartialViewResult/" + id + "?t=" + new Date().getTime();
...

これにより、常に新しいコンテンツが読み込まれます。

于 2012-07-17T18:05:05.950 に答える