0

WebGridMVC3 Web アプリケーションでを作成しました。私のアプリケーションでは、並べ替え、フィルタリング、およびページングが有効になっています。

問題:でフィルタリングが実行されるたびに、フィルタリングされたwebgridデータが に入力されますWebgrid。しかし、2 番目のページをクリックしてWebgrid、検索したテキストでフィルター処理された残りのデータを表示すると、フィルター処理された残りのデータは表示されず、グリッド内のすべての項目の完全なリストが表示されます。

WebGrid でデータをフィルタリングした後、2 ページ目のデータを取得するにはどうすればよいですか。

サイトで同様の質問を見たことがありますが、問題は解決しません。

私の見解: 通常のビューによって呼び出される、グリッドを設定するための部分的なビューを作成しました。私はこのチュートリアルに従ってそれを行いました。

コントローラ: 初めてWebgrid、モデル内の別のメソッドを使用してデータをロードし、データベースからすべてのデータを移入します

私の部分的なビュー コード:

@{
    ViewBag.Title = "listStudents";
    Layout = "~/Views/Shared/_Layout.cshtml";
    WebGrid grid = new WebGrid(Model, canPage: true, canSort: true, rowsPerPage: 3); 
}

@grid.Pager(WebGridPagerModes.NextPrevious)
        @grid.GetHtml(  //Error at this line
        htmlAttributes: new { id = "grdListStudents" },
    fillEmptyRows: true,
    headerStyle: "tblHeader",
    tableStyle: "tablestyle",
    mode: WebGridPagerModes.All,
    firstText: "<< First",
    previousText: "< Previous", nextText: "Next >",
    lastText: "Last >>",
    columns: new[]{
        grid.Column("intID","SId",canSort:true),
        grid.Column("strFirstName","Name",canSort:true,format:(item)=>item.strFirstName+"   "+item.strLastName),
        grid.Column("strPhone","Phone",canSort:true),
        grid.Column("strEmail","Email",canSort:true),
    }
    )

コントローラーのコードは次のとおりです。

public readonly IStudentInfo _istudentrepository;

public studentController( IStudentInfo _iStudentRepository)
{
            this._istudentrepository = _iStudentRepository;
}

//To filter according to Searched Text

[HttpPost]
        public ActionResult studentController(string txtSearch,string ddlTitle,FormCollection collect)
        {
            IEnumerable<Students> sList;
            sList = _istudentlistrepository.getAllStudentsList();

            if (txtSearch != "")
            {
                switch (ddlTitle)
                {
                    case "intId":
                        int sId = Convert.ToInt32(txtSearch);
                        sList = sList.Where(b => b.intId == sId).ToList();
                        break;
                    case "strFirstName":
                        sList = sList.Where(b => b.strFirstName.ToLower().Contains(txtSearch.ToLower())).ToList();
                        break;
                    case "strPhone":
                        sList = sList.Where(b => b.strPhone.ToLower().Contains(txtSearch.ToLower())).ToList();
                        break;
                    case "strEmail":
                        sList = sList.Where(b => b.strEmail.ToLower().Contains(txtSearch.ToLower())).ToList();
                        break;
                }
            }
            return PartialView("_grdListStudents", sList);
        }
    public ActionResult studentController(string sort, string sortdir, int? page)
    {
                int startPage = 0;
                IEnumerable<Students> sList;
                if (page.HasValue && page.Value > 0)
                {
                    startPage = page.Value;
                }
                sList = _istudentrepository.GetList(startPage, PageSize, sort, sortdir);
                return View(sList);

    }

インターフェイス IStudentInfo のコード:

public interface IStudentInfo
    {
        IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir);

    }

モデル内のコード:

private MyEntity _entity;

public StudentListRepository(MyEntity Ent)
{
            this._entity = Ent;
}
public IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir)
{

            var finalresult = new Students();
            var bidList = (from userInfo in _entity.tbl_UserInf
                           join user in _entity.tbl_User on userInfo.UserId equals user.UserId
                           select new Students()
                           {
               intID=user.UserId,
                               strFirstName = user.FirstName,
                               strEmail = userInfo.EmailId,
                               intPhone=userInfo.Phone
                           }).OrderByDescending(m => m.intID);
            finalresult.TotalResult = bidList.Count();
            switch (strSort)
            {
                case "intID":
                    if (sortdir == "ASC")
                    {
                        sList = sList.OrderBy(r => r.Id);
                    }
                    else
                    {
                        sList= sList.OrderByDescending(r => r.Id);
                    }
                    break;
    case "strFirstName":
                    if (sortdir == "ASC")
                    {
                        sList = sList.OrderBy(r => r.strFirstName);
                    }
                    else
                    {
                        sList= sList.OrderByDescending(r => r.strFirstName);
                    }
                    break;
    case "strEmail":
                    if (sortdir == "ASC")
                    {
                        sList = sList.OrderBy(r => r.strEmail);
                    }
                    else
                    {
                        sList= sList.OrderByDescending(r => r.strEmail);
                    }
                    break;
                    //repeat same for phone
           }
          finalresult.lstStudents = sList.Skip(intPage * intRecords).Take(intRecords).ToList();
           return sList.ToArray();
}
4

1 に答える 1

0

ビューモデルには、アイテムのリストと、検索テキスト、ページサイズ、現在のページ、および合計レコード数の値が含まれている必要があります。私はこれらのプロパティを持つ汎用基本クラスを使用します:

public class PagedViewModel<T> {
    public IList<T> Items { get; set; }
    public int PageSize { get; set; }
    public int RowCount { get; set; }
    public int Page { get; set; }
    public int PageCount { get; set; }
    public string sort { get; set; }
    public string sortdir { get; set; }
}

次に、具体的なViewmodelは次のようになります。

public class StudentsListViewModel : PagedViewModel<Students> {
    public string Search { get; set; }
}

Ajax.BeginForm私が読んだコメントから、 ajaxを介してグリッドを更新したいと思います。次に、2つのアクションが必要です。1つはページ全体用で、もう1つはグリッド(部分的)用です。

最初のアクションはページ全体を返します。

public ActionResult Index() {
    StudentsListViewModel model = queryStudents(1, 10, null);
    return View(model);
}

2番目のアクションは、グリッドの部分ビューを返します。

public ActionResult UpdateStudentsGrid(StudentsListViewModel model) {
    model.Items = queryStudents(model);
    return Partial("StudentsGrid", model);
}

ヘルパーメソッドはデータをクエリし、フィルタリングされたリストを返します。

private StudentsListViewModel queryStudents(int page, int rowsPerPage, 
                                             string search) {
    StudentsListViewModel = new StudentsListViewModel {
        Page = page,
        PageSize = rowsPerPage,
        Items = db.Students.Where(s => s.Name == search || search == null)
            ... add paging...;
    };
    // ToDo: set additional properties on model
    return model;
}

メインページビューには、ajaxフォームが含まれています。リストは部分ビューでレンダリングされます。

@model StudentsViewModel
@using (Ajax.BeginForm("UpdateStudentsGrid", 
         new AjaxOptions { UpdateTargetId = "grid" })) {

    @Html.TextboxFor(m => m.Search)
    <input type=submit" />
    <div id="grid">
        @Html.Partial("StudentsGrid", Model);
    </div>
}

部分ビューは次のようになり、グリッドのみをレンダリングします。

@{ 
    var grid = new WebGrid(Model.Items, canPage: true, canSort: true,
                           rowsPerPage: Model.PageSize);
}
@grid.GetHtml(...)

私はコードをテストまたはコンパイルしていません。ここにある状態ではおそらく機能しませんが、開始する必要があります。

編集:忘れられたポケットベル

ページャーリンクをフォームで機能させるには、次の記事に従ってフォームメソッドをPOSTからGETに変更するだけです。http://www.mikepope.com/blog/DisplayBlog.aspx?permalink = 2377

しかし、それがajaxフォームでどのように機能するかはわかりません。

別のアプローチは、ポケットベルリンクのクリックをインターセプトし、代わりにメソッドPOSTを使用してフォームを送信することです:http://forums.asp.net/t/1703486.aspx/1

于 2012-11-26T15:15:10.677 に答える