5

WebGrid をレンダリングする部分ビューがあります。私のコントローラーは次のようになります

public ActionResult Index()
{
    return View();
}
public ActionResult GetUserList(int? page, string sort, string sortdir)
{
    var model = UserModel.getList(page,sort,sortdir);
    return PartialView("_UserList",model);
}

Index.cshtml : 問題は、グリッド ナビゲーションをクリックするか、リンクを並べ替えるたびに、メソッドが呼び出されることです。Webgrid に別のアクション (この場合) を実行させるにはどうすればよいですか? jquery を使用してグリッド内のすべてのリンクの先頭に追加できると確信していますが、それはより良い方法であると考えています。 私がやっていることは完全に間違っている可能性もありますので、あなたの提案に感謝します。
....
@Html.Action("GetUserList")

IndexGetUserListGetUserList

4

4 に答える 4

5

いろいろと調べたり (さらには WebGrid のソース コードで Reflector をいじったり) した結果、WebGrid ではヘッダー リンク アクションを制御/変更できないという結論に達しました。

ヘッダー リンク URL を作成するために、パスは から取得されるHttpContext.Request.Pathため、別のルートを指すようにカスタマイズする方法はありません。

非常に厄介なハックの 1 つは、jQuery Ajax のイベントを利用して (ヘッダー リンクが jQuery.load を使用してソートするため)、URL を上書きすることです。

<a href="#" onclick="$('#myGrid').load('/?sort=AlbumId&amp;sortdir=ASC&amp;__=634486582282704242 #myGrid');">Album Id</a>

より良い解決策は、次を使用することです。

  • カスタム ルートを指定できる Telerik Grid と、レイアウトのレンダリングの柔軟性が大幅に向上
  • またはMvcContrib Grid (これでヘッダー リンクを変更できるかどうかはわかりませんが、WebGrid よりも確実に柔軟性があります)
于 2011-08-10T05:54:38.283 に答える
2

あなたの結論は正しくありません。WebGrid を Get フォームでラップするだけです。

using (Html.BeginForm("GetUserList", "ThingaMaBob", System.Web.Mvc.FormMethod.Get))
{
 var grid = new WebGrid(
...
));

    Html.Hidden(grid.SortFieldName, grid.SortColumn);
    Html.Hidden(grid.SortDirectionFieldName, grid.SortDirection == SortDirection.Ascending ? "ASC" : "DESC");
}

非表示は、並べ替えディレクトリと並べ替えフィールドがクエリ文字列で解析可能な形式になるようにするためのものです。localhost/ThingaMaBob/GetUserList?someotherfields=whatever=&sort=city&sortdir=ASC のような URL になります。

于 2012-06-22T20:13:45.203 に答える
2

@MrChiefは醜いハックについて上記の考えを持っていました...私はそれをまとめました。これが私がこれを行うために使用したメインコードです。確かに、ネットワークに接続される前に ajax 呼び出しをハイジャックします。重要なのは、送信される URL を変更することです。これは、グリッドが HttpContext.Request.Path からその URL を取得するためです。アンカー要素の onclick にプラグインします。

これをメインの common.js に配置し、データが送信される直前に発生する ajaxSend イベントをキャプチャする関数を添付するだけです。

// Used to hijack the sending of all AJAX calls.  Before it sends the call to the server, it checks to see if the 
// active element (the element that prompted the call) is marked with a given class.  If so, then it will perform
// the given operation.  
$(document).ajaxSend(function (event, jqXHR, ajaxOptions) {

    var activeElement = document.activeElement;

    if ($(activeElement).attr('redosorturl') != null) {

        // If this is a sort anchor link from a grid that needs to have the sort link redone, do it here.
        // the code is in the eipGrip.js file.
        if ($(activeElement).attr('redosorturl').toString() == 'redoSortURL') {
            var newURL = RedoGridSortURL(activeElement, ajaxOptions.url.toString());
            ajaxOptions.url = newURL.toString();
        }
    }

    return false;
});

ページをレンダリングするときに、間違った URL を含む列ヘッダーのタグを「redosorturl」という名前のクラスでマークしたので、ajax 呼び出しを乗っ取ったときに、この要素で操作を行う必要があることがわかります。正しい URL を提供するカスタム関数を使用すると、ajaxOptions.url がその新しい URL で書き換えられます。

DOM をトラバースしてグリッド情報を取得できるように、activeElement をその書き換え関数に渡す必要があります。グリッド情報には、URL に使用する ID やその他の情報と共に使用されるコントローラーやアクション メソッドなどのデータを配置します。 . 同様に、現在の URL 文字列を渡します。これは、グリッドが URL の末尾にトークンを挿入し、それを解析して新しい URL に配置するためです。

于 2011-12-14T16:40:46.933 に答える
0

[HttpPost] 属性を削除して、ルートが同じ関数に来るようにすると。メソッドで Request["page"] 値を見つけることができます。これにより、Request["Page"] 値にチェックを入れることができます。

于 2015-04-23T18:17:21.700 に答える