0

ASP.NET MVC 4でページ付けを作成しています。データベースからレコードを取得する方法は、Webサービスからレコードを受信した後、セッション変数に保存することです。しかし、Webサービスの呼び出しを続行する前に、セッションで最初にクエリを実行します。クエリが値を返す場合、Webサービスの呼び出しを続行しませんが、クエリがnullを返す場合、Webサービスの呼び出しを続行します。これが私のコードです。

[HttpPost]
public ActionResult Getitems(int take,int skip)
{
  var check = ((List<Records>)Session["tempRecord"])
               .Orderby(item => item.ID)
               .Skip(skip)
               .Take(take).ToList();

  if (check.count == 0)
  {
        //code for calling a webservice
        string Result = ServiceCaller.Invoke("Record/getRecord?skip=" + skip + "&take=" + take,"POST","Application/Json");
        List<Records> ListResult = JsonHelper.Deserialize<List<Records>>(Result);            

        //code for appending result in the session
        ((List<Records>)Session["tempRecord"]).addRange(ListResult);
        return Json(ListResult);
  }
  else
  {
        return Json(Check);
  }
}

さて、ここに問題があります。ページが読み込まれると、現在の値はセッションが初期値になりますが、ユーザーが最初に大きいページ番号をクリックすると、上記のコードに進みますが、チェック変数は0カウントを返すため(まだ初期値が残っているため)値)、Webサービスを呼び出し、セッションを追加します。次に、ユーザーが最初にクリックしたページより下のページをクリックすると、クエリ中のセッションにはすでに値があるため、同じ値が返されます。

たとえば、テーブルに合計5つのレコード(item1、item2、item3、item4、item5)があります。

すべてのページは1レコードで、セッションの初期値は(item1)なので、次のようになります。

  • item1

| 1 | 2 | 3 | 4 | 5 |

ユーザーがページ「4」をクリックすると、次のようになり、セッションの現在の値は次のようになります(item1、item4)

  • item4

| 1 | 2 | 3 | 4 | 5 |

ただし、ユーザーがページ「4」より下のページをクリックしても、出力は同じ「item4」のままですが、ユーザーがページ「4」より上をクリックすると、正常に機能します。

なにか提案を???

4

1 に答える 1

2

ですから、私が正しく理解すれば、グリッドビューのようなものがあります。ページングとは?もしそうなら、なぜあなたはただページ番号を送らないのですか?なぜ2つの変数?

ページ番号を送信してから、次のようなことを行うことはできません。

public ActionResult GetItems(int page){

var numberitems = 10;
var skip = page * numberitems;
var take = skip+numberitems;

    //code for calling a webservice
    string Result = ServiceCaller.Invoke("Record/getRecord?skip=" + skip + "&take=" + take,"POST","Application/Json");
    List<Records> ListResult = JsonHelper.Deserialize<List<Records>>(Result);            

    //code for appending result in the session
    ((List<Records>)Session["tempRecord"]).addRange(ListResult);
    return Json(ListResult);
}

あなたのビューからテイクアンドスキップするのは奇妙なようです...

編集:

public ActionResult GetItems(int page){
   var numberitems = 10;
   var skip = page * numberitems;
   var take = skip+numberitems;
if(Session["PageID"] == null || Session["cacheRecord"] == null){
   //code for calling a webservice
   string Result = ServiceCaller.Invoke("Record/getRecord?skip=" + skip + "&take=" + take,"POST","Application/Json");
   List<Records> ListResult = JsonHelper.Deserialize<List<Records>>(Result);            

   //code for appending result in the session
   ((List<Records>)Session["cacheRecord"]).addRange(ListResult);
   Session["PageID"] = page;
   return Json(ListResult);
 }else{
if(Session["PageID"] == page){
      var result = ((List<Records>)Session["tempRecord"])
           .Orderby(item => item.ID)
           .Skip(skip)
           .Take(take).ToList();
      return Json(result);
    }else{
   Session["PageID"] = page;
       string Result = ServiceCaller.Invoke("Record/getRecord?skip=" + skip + "&take=" + take,"POST","Application/Json");
       List<Records> ListResult = JsonHelper.Deserialize<List<Records>>(Result);            

       //code for appending result in the session
       ((List<Records>)Session["tempRecord"]).addRange(ListResult);
  return Json(ListResult);

}

}

于 2012-11-09T10:02:04.723 に答える