【问题标题】:Combining pagination and refinement in webmatrix/razor在 webmatrix/razor 中结合分页和细化
【发布时间】:2013-03-25 04:26:50
【问题描述】:

我正在尝试结合 Mike Brind 提供的两个教程。它们单独工作,但组合起来却不起作用,我确信这只是我需要做的一个简单的改变。

我想在多个页面上显示查询,但如果我更改搜索参数,我希望它更新。这是我的代码(使用 Mike 的书籍示例):

@{
    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 时,它不仅显示匹配的结果,还显示所有类别。

【问题讨论】:

  • 如果您没有收到回复,则表明您可能没有在您的问题中提供足够的信息。正确的做法是重新阅读您的问题,尝试找出更多有用的信息来添加,并继续自己调查并从中添加信息。 错误的做法是将您的问题标记为已回答,然后以no changes的形式重新发布。
  • 我确实重读了它,并进行了编辑,但仍然没有得到回应,所以这是唯一的选择,抱歉。
  • 不,这不是唯一的选择。 Setting a Bounty:“为了得到好的答案,你必须在问题上付出努力。编辑问题以提供状态和进度更新。记录你自己为回答问题所做的持续努力。这自然会碰到问题并获得更多对它感兴趣的人。但是,如果在这样做之后,您觉得某个特定问题仍然没有得到足够的关注,那么添加赏金可能会有所帮助。”
  • 谢谢,您的帮助非常大:s 您能否就我的问题提供任何有用的建议,或者您只是觉得无聊?
  • Gavin:Damien 确实提供了有用的建议。

标签: sql asp.net-mvc razor paging webmatrix


【解决方案1】:

您的 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);
}

同样的问题出现在第二个 sql 语句中。执行与上述调整偏移类似的操作。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 2012-09-15
    • 2011-04-28
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多