ASP.NET MVC搜索与分页表 [英] ASP.NET MVC Search Form with Pagination

查看:150
本文介绍了ASP.NET MVC搜索与分页表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

林在失去了言语,因为我必须失去了一些东西。刚刚结束的ASP.NET MVC 1.0(WROX)和我试着去实现执行那么简单搜索呈现在一个表中的结果视图。那么我想能够直通页的结果。

Im at a loss for words, as I must be missing something. Just finished ASP.NET MVC 1.0 (WROX) and Im trying to implement a view that performs a simple search then renders the results in a table. I would then like to be able to page thru the results.

所以我有从ListingsController搜索行动,需要从一些的FormCollection值,并相应地对结果进行过滤:

So I have a search action from ListingsController, takes some values from FormCollection and filters the results accordingly:

        //
    //POST: /Listings/Search
    //      /Listings/Page/2
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Search(FormCollection collection,int? page)
    {
        var listings = listingRepository.GetListings();

        //filter
        if (collection["TypeOfHouse"] != null)
        {
            string[] typeList = collection["TypeOfHouse"].Split(',');

            foreach (string type in typeList)
            {
                listings = from l in listings
                           where l.TypeOfHouse == type
                           select l;
            }
        }

        //display the first page of results
        int pageSize = 25;
        var paginatedListings = new PriviledgeV1.Helpers.PaginatedList<Listing>(listings, 0, pageSize);



        return View("Results", paginatedListings);
    }

最初结果视图将与第25记录1页中呈现然后,我有一个结果的行动,处理了分页:

Initially the Results view will be rendered with the first 25 records for page 1. Then I have a Results action that handles the "pagination":

    public ActionResult Results(int? page)
    {
        int pageSize = 25;
        var listings = listingRepository.GetListings();
        var paginatedListings = new PriviledgeV1.Helpers.PaginatedList<Listing>(listings, page ?? 0, pageSize);

        return View(listings);
    }

麻烦的是,因为我不再有的FormCollection,我不能正确地过滤结果。所以,如果我试图从页面比如运动1〜2页使用/人数/结果?页= 2,结果行动将火,它会返回所有结果,而不是从搜索行为设置过滤结果。

Trouble is because I no longer have the FormCollection, I cannot properly filter results. So if I tried to move from say page 1 to page 2 using /Listings/Results?page=2, the results action would fire and it would return ALL results instead of the filtered result set from the Search action.

我来这里做什么真的很困惑,以及为何没有博客/教程解释这一点,通常我的标志,我失去了一些东西。

I'm really confused as to what to do here, and as to why there are no blogs/tutorials explaining this, which normally flags me that I am missing something.

谢谢!

推荐答案

我想有几个方法来尝试实现这一目标。

I suppose there are a few ways to try and accomplish this.


  1. 通过传递的查询字符串,而不是职位搜索参数。可以理解的是,这可能是复杂而凌乱的高级搜索参数

  2. 存放POST的结果,隐藏要素。让你的分页控制POST到同一个动作每一次,而不是单独的结果操作。

  3. 店铺在在会话持久对象的查询参数。

我敢肯定,我们可以得到从那里更多的创意,但应该给你一个起点。好像你只从搜索表单关心的一个字段, TypeOfListing 。您应该能够坚持,它通过查询字符串pretty容易,所以会是上述方法#1。

I'm sure we could get more creative from there, but that should give you a start. It seems like you only care about one field from the search form, TypeOfListing. You should be able to persist that via query string pretty easily, so that'd be method #1 above.


更新

下面是一些简单的我放在一起,以保持您在客户端的搜索。该技术涉及三个部分:

Here's something simple I put together to maintain your search at the client. The technique involves three parts:


  1. 维护页面请求的形式。

  2. 与表单中的隐藏元素管理页面的状态。

  3. 的JavaScript拦截分页链接,更新页面数量隐藏的元素,并重新提交表单。

这里的code所有的各个部分。请注意,我使用jQuery,如果你preFER别的东西。我捏造数据源,只是在实际数据子。另外,我包括PagedList和PaginationHelper。用自己的替换如果你想。

Here's the code for all the various pieces. Note that I use jQuery, in case you prefer something else. I fudged the data source, just sub in real data. Also, I included PagedList and PaginationHelper. Substitute with your own if you wish.

\\控制器\\ HomeController.cs (搜索是相关部分):

\Controllers\HomeController.cs (Search is the relevant part):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication2.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        List<String> _data;

        public HomeController()
        {
            _data = new List<String>();
            _data.Add("Merry");
            _data.Add("Metal");
            _data.Add("Median");
            _data.Add("Medium");
            _data.Add("Malfunction");
            _data.Add("Mean");
            _data.Add("Measure");
            _data.Add("Melt");
            _data.Add("Merit");
            _data.Add("Metaphysical");
            _data.Add("Mental");
            _data.Add("Menial");
            _data.Add("Mend");
            _data.Add("Find");
        }

        public ActionResult Search()
        {
            Int32 pageNumber, pageSize = 5, total, first;
            String typeOfListing;
            PagedList<String> results;

            if (Request.HttpMethod == "GET")
            {
                return View();
            }

            if (!Int32.TryParse(Request.Form["PageNumber"], out pageNumber)) pageNumber = 1;
            typeOfListing = Request.Form["TypeOfListing"];

            first = (pageNumber - 1) * pageSize;
            total = (from s in _data
                     where s.Contains(typeOfListing)
                     select s).Count();
            results = new PagedList<String>(
                            (from s in _data
                             where s.Contains(typeOfListing)
                             select s)
                             .Skip(first)
                             .Take(pageSize), 
                            total, pageNumber, pageSize);


                return View(results);
        }
    }
}

\\助手\\ PaginationHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace MvcApplication2.Helpers
{
    public static class PaginationHelper
    {
        public static String Pager(this HtmlHelper helper, Int32 pageSize, Int32 pageNumber, Int32 total, String actionName, RouteValueDictionary values)
        {
            StringBuilder output = new StringBuilder();
            Int32 totalPages = (Int32)Math.Ceiling((Double)total / pageSize);

            if (values == null)
                values = helper.ViewContext.RouteData.Values;

            if (pageNumber > 1)
                output.Append(CreatePageLink(helper, values, "< Previous ", pageNumber - 1, pageSize));

            for (Int32 i = 1; i <= totalPages; i++)
            {
                if (i == pageNumber)
                    output.Append(i);
                else
                    output.AppendFormat(CreatePageLink(helper, values, i.ToString(), i, pageSize));

                if (i < totalPages)
                    output.Append(" | ");
            }

            if (pageNumber < totalPages)
                output.Append(CreatePageLink(helper, values, " Next >", pageNumber + 1, pageSize));

            return output.ToString();
        }

        private static String CreatePageLink(HtmlHelper helper, RouteValueDictionary values, String text, Int32 pageNumber, Int32 pageSize)
        {
            RouteValueDictionary routeDictionary = new RouteValueDictionary(values);
            routeDictionary.Add("page", pageNumber);
            routeDictionary.Add("pageSize", pageSize);

            return helper.ActionLink(text, null, routeDictionary);
        }
    }
}

\\ PagedList.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication2
{
    public class PagedList<T> : List<T>
    {
        public Int32 TotalCount { get; protected set; }
        public Int32 PageNumber { get; protected set; }
        public Int32 PageSize { get; protected set; }

        public PagedList(IEnumerable<T> items, Int32 total, Int32 pageNumber, Int32 pageSize)
            : base(items)
        {
            TotalCount = total;
            PageNumber = pageNumber;
            PageSize = pageSize;
        }
    }
}

\\浏览\\首页\\ Search.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PagedList<String>>" %>
<%@ Import Namespace="MvcApplication2" %>
<%@ Import Namespace="MvcApplication2.Helpers" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Search
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <script type="text/javascript">
        $(function() {
            var results = $("#searchResults");
            if (results && results.children().length > 2) {
                $("#searchForm").hide();
                $("#searchResults .pager>a").click(submitForm);
            }
        });

        function submitForm() {
            var m = this.href.match(/page=(\d+)/i);
            if (m) {
                $("#PageNumber").attr("value", m[1]);
                $("#searchForm").submit();
            }
            return false;
        }
    </script>
    <form id="searchForm" action="<%= Url.Action("Search") %>" method="post">
        <input type="hidden" value="1" id="PageNumber" name="PageNumber" />
        <fieldset>
            <legend>Search</legend>
            <label for="TypeOfListing">Type of Listing</label>
            <%= Html.TextBox("TypeOfListing", Request.Form["TypeOfListing"]) %>
            <input type="submit" id="btnSubmit" name="btnSubmit" value="Search" />
        </fieldset>
    </form>
   <% if (Model != null)
   {
   %>
    <div id="searchResults">

        <div class="results-count">Displaying <%=this.Model.Count %> of <%=this.Model.TotalCount %> results. <%=Html.ActionLink("Start a new search", "Search") %>.</div>
        <%
               foreach (String result in Model)
               { 
        %>
        <div class="result"><%=result %></div>

        <%     }
        %>

        <div class="pager"><%= Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalCount, null, null) %></div>
    </div>
    <%
     } 
    %>
</asp:Content>

这篇关于ASP.NET MVC搜索与分页表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆