2

Mike Brind が提供する 2 つのチュートリアルを組み合わせようとしています。単独では機能しますが、組み合わせると機能しません。単純な変更を加える必要があるだけだと確信しています。

複数のページにわたってクエリを表示したいが、検索パラメータを変更すると更新されるようにしたい。これが私のコードです(マイクの本の例を使用):

@{
    Page.Title = "Paging Books";
    Page.Header = "View Books";

    var pageSize = 3; 
    var totalPages = 0; 
    var count = 0;
    var page = UrlData[0].IsInt() ? UrlData[0].AsInt() : 1;
    var offset = (page -1) * pageSize;

    var db = Database.Open("Books");
    var sql = "Select Count(*) From Books " + 
           "Inner Join Authors on Books.AuthorId = Authors.AuthorId " + 
           "Inner Join Categories on Books.CategoryId = Categories.CategoryId";
    count = (int)db.QueryValue(sql);
    totalPages = count/pageSize;        
    if(count % pageSize > 0){
        totalPages += 1;
    }
    sql = "Select Title, ISBN, Description, FirstName, LastName, Category From Books " + 
           "Inner Join Authors on Books.AuthorId = Authors.AuthorId " + 
           "Inner Join Categories on Books.CategoryId = Categories.CategoryId " +
           "Order By BookId OFFSET @0 ROWS FETCH NEXT @1 ROWS  ONLY;";

    var result = db.Query(sql, offset, pageSize);

    var categories = db.Query("Select CategoryID, Category FROM Categories");
}

<form method="post" action="">
    Select Category:
    <select name="CategoryID">
        <option value="">-- View All Books --</option>
        @foreach(var c in categories){
            <option value="@c.CategoryId">@c.Category</option>
        }
    </select> <br />
    <input type="submit" name="Action" value="Select" />
</form>           

<p>Page @page of @totalPages</p>
@if(IsPost){
    foreach(var row in db.Query(sql, offset, pageSize, Request["CategoryID"])){
        <h2>@row.Title</h2>
        <p><strong>Author:</strong> @row.FirstName @row.LastName<br />
            <strong>ISBN:</strong> @row.ISBN <br/>
            <strong>Description:</strong> @row.Description <br />
            <strong>Category: </strong> @row.Category</p>
    }
}


@{
    for (var i = 1; i < totalPages + 1; i++){
        <a href="/Paging/@i">@i</a>
    }
}

このコードは現在、正しいページにすべての情報を表示していますが、 を変更するCategoryと、一致する結果が表示されるだけでなく、すべてのカテゴリが表示されます。

4

1 に答える 1

4

あなたの ASP コードは不完全です。書籍の完全なリストを返す SQL コードしかありません。ユーザーが選択したカテゴリに従ってフィルタリングするステートメントはどこにも含まれていません。

実行する前に:

var sql = "Select Count(*) From Books " + 
       "Inner Join Authors on Books.AuthorId = Authors.AuthorId " + 
       "Inner Join Categories on Books.CategoryId = Categories.CategoryId";

空でない値を持つ属性 CategoryID がリクエストに含まれているかどうかをテストする必要があります。空でない場合は、別の sql を定義してカテゴリをフィルタリングします。そのようです:

if(!Request.QueryString["CategoryID"].IsEmpty() ) {
    var sql = "Select Count(*) From Books " + 
           "Inner Join Authors on Books.AuthorId = Authors.AuthorId " + 
           "Where Books.CategoryID=@0";
    count = (int)db.QueryValue(sql, Request.QueryString["CategoryID"])
}
else {
    var sql = "Select Count(*) From Books " + 
           "Inner Join Authors on Books.AuthorId = Authors.AuthorId "; // no need for 2nd inner join
    count = (int)db.QueryValue(sql);
}

2 番目の sql ステートメントでも同じ問題が発生します。上記のオフセット調整と同様の操作を行います。

于 2013-04-10T19:49:36.860 に答える