0

私はGridViewにSelectMethodを使用しています.ModelBndingを使用しています。単純化されたビュー:

<asp:GridView AllowPaging="True" 
        AllowSorting="True"
        runat="server"
        PageSize="10" 
        SelectMethod="GetRedirections"
        ID="rediretionGrid" AutoGenerateColumns="False" 
        ItemType="TTC.TT.Entities.ViewModels.Redirections.RedirectionView"
        DataKeyNames="Id"
        >
...
</asp:GridView>

背後にあるコード:

public IQueryable<RedirectionView> GetRedirections2([Control] string filter)
{
    var mappings = RedirectionService.GetRedirections().Where(x => x.Source.Contains(filter)).AsQueryable();

    // Setting PageIndex to 0 doesn't solve the problem.
    rediretionGrid.PageIndex = 0;
    return mappings;
}

フィルターが人気のあるものに設定されている場合、複数の結果が返されます (たとえば 2000) ユーザーは別のページネーション ページに移動できます (たとえば、彼は 30 ページに移動します) 残念ながら、フィルターを人気のないものに変更し、結果がそれほど多くない場合が返されます (たとえば、3 つの結果) DataGrid は、ユーザーが遠く離れたページ (30) にいたという情報を保存し、新しいフィルタリングに関してそのページを表示しようとしているため、「アイテムが見つかりませんでした」という情報を表示します。 . ユーザーが最初のページにいる場合、すべてが機能しています。回避策とは何ですか? フィルターが変更されたときに最初のページ (または結果を表示する他のページ、通常は最後のページ) にユーザーを送信する方法、または複数のレコードがある場合でも DataGrid に何も表示されない状況を回避するために何かを行うにはどうすればよいですか?発見されました。

PageIndex を 0 に設定した私の実験では、問題は解決しません (より多くの問題が発生しますが、誰かがこの回答を提案した場合に備えて、言及したいだけです)。PageIndex を 0 に設定しても、DataGrid に結果が表示されません。

明確にするために、私はこの問題を解決する方法を知っていますが、実装には時間がかかり、M$ がこれが発生するのを潜在的に見ない可能性があるとは信じられません。追加のイベント リスナーを実装し、この状況を処理するためにカスタム ロジックを追加する必要がある場合、SelectMethod で ModelBinding を使用するのは無意味です。このカスタム ロジックを記述すると、SelectMethod と ModelBinding を使用しない場合よりも時間がかかるため、その価値はありません。

更新: SelectMethod の戻り値の型を使用した簡単な実験では、GetRedirection2 メソッドの定義を次のように変更すると、次のことがわかりました。

public IEnumerable<RedirectionView> GetRedirections2(int maximumRows, int startRowIndex, out int totalRowCount, string sortByExpression, [Control] string filter)

そして、私は自分でページネーションとソートを行い、次のように PageIndex を 0 に設定しようとします。

if (startRowIndex > totalRowCount)
{
    rediretionGrid.PageIndex = 0;
}

今設定しても手遅れなので、問題は解決しません。DataGrid はまだ startRowIndex を保存しており、返されたデータを処理するために使用していると思います。そして最後に PageIndex を使用し、実際には別のページを表示したときに、ページ 0 を表示するふりをします。だから私がしたいのは、totalRowCount が処理されるのと同じように、パラメーターを out としてマークするように startRowIndex を変更する方法です。

4

1 に答える 1

0

私が思いついた最も簡単で迅速な実装方法ですが、私が見たいものに関してひどい方法でもあるのは、ページ全体をリロードすることです。そこで、元の GetRedirections2 メソッド定義に戻りました。以下のコードは、可視性の理由から単純化されています。

public IQueryable<RedirectionView> GetRedirections2([Control] string filter)
{
    var mappings = RedirectionService.GetRedirections().Where(x => x.Source.Contains(filter));

    // This is a terrible hack to redirect user to a first page.
    if (rediretionGrid.PageIndex * rediretionGrid.PageSize > mappings.Count)
    {
        Response.Redirect(Paths.Redirections.Index_aspx + "?filterValue=" + filter);
    }
    return mappings.AsQueryable();
}

そしてPage_Loadで:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;
    var filterValue = Request.QueryString["filterValue"];
    filter.Text = filterValue;
}

このようなハックを実装する必要がない、適切な方法があればいいのにと思います:(

于 2013-11-06T12:08:28.820 に答える