2015-03-31 36 views
1

我有一个索引页,其上有各种过滤选项,全部包含在PagedList中。除了日期之外,它们似乎都工作正常。mvc pagedlist日期在第二页丢失值

当我第一次过滤日期时,他们工作正常,但是当我点击底部的页码时,我的日期的搜索条件正在消失。

我可以看到,我可以通过搜索项在分页列表中,我可以看到这个日期击中了我的控制和过滤发生,但ViewBag.filterStartDate和ViewBag.filterEndDate只是没有约束力回到我的文本框因为某些原因。

Index.cshtml:

@using PagedList.Mvc 
@model PagedList.IPagedList<Job> 

@using (Html.BeginForm("Index", "Jobs", FormMethod.Get, new { @class = "form-inline", role = "form" })) 
{ 
    <div class="panel panel-default"> 
     <!-- Default panel contents --> 
     <div class="panel-heading">Filter Search Results</div> 
     <div class="panel-body"> 

      <ul class="list-group"> 
       <li class="list-group-item"> 
        @Html.Label("By Id: ", new { @class = "col-md-4 control-label" }) 
        @Html.TextBox("filterId", ViewBag.filterId as string, new { @class = "form-control" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("By Address Line 1: ", new { @class = "col-md-4 control-label" }) 
        @Html.TextBox("filterAddress1", ViewBag.filterAddress1 as string, new { @class = "form-control" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("By Username: ", new { @class = "col-md-4 control-label" }) 
        @Html.TextBox("filterUsername", ViewBag.filterUsername as string, new { @class = "form-control" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("By Contract: ", new { @class = "col-md-4 control-label" }) 
        @Html.DropDownList("filterContract", null, "-- Select One --", 
         new { @class = "form-control" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("Date Created Start: ", new { @class = "col-md-4 control-label" }) 
        @Html.TextBox("filterStartDate", ViewBag.filterStartDate as string, new { @class = "form-control date", type = "date" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("Date Created End: ", new { @class = "col-md-4 control-label" }) 
        @Html.TextBox("filterFinishDate", ViewBag.filterFinishDate as string, new { @class = "form-control date", type = "date" }) 
       </li> 
       <li class="list-group-item"> 
        @Html.Label("By App: ", new { @class = "col-md-4 control-label" }) 
        @Html.DropDownList("filterApp", null, "-- Select One --", 
         new { @class = "form-control" }) 
       </li> 
      </ul> 

      <input type="submit" value="Apply Filter" class="btn btn-default" /> 

     </div> 

     <div id="items" style="padding: 15px;"> 
      @Html.Partial("Jobs", Model) 
     </div> 

    </div> 

} 

Jobs.cshtml:

@using System.Web.UI.WebControls 
@using PagedList.Mvc 
@model PagedList.IPagedList<Job> 

@Html.ActionLink("Create New", "Create", null, new { @style = "float: left" }) 

@Html.ActionLink("Import Jobs", "Import", null, new { @style = "padding-left: 15px" }) 

@Html.ValidationSummary(true) 

<table class="table"> 
    <tr> 
     <th class="mobileview"> 
      @Html.DisplayName("JobId") 
     </th> 
     <th> 
      @Html.DisplayName("Description") 
     </th> 
     <th class="mobileview"> 
      @Html.DisplayName("Address") 
     </th> 
     <th class="mobileview"> 
      @Html.DisplayName("Priority") 
     </th> 
     <th> 
      @Html.DisplayName("Date Created") 
     </th> 
     <th> 
      @Html.DisplayName("Username") 
     </th> 
    </tr> 

    @foreach (var item in Model) 
    { 
     <tr class="formrow"> 
      <td class="mobileview"> 
       @Html.DisplayFor(modelItem => item.JobId) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Description) 
      </td> 
      <td class="mobileview"> 
       @Html.DisplayFor(modelItem => item.Address1) 
      </td> 
      <td class="mobileview"> 
       @Html.DisplayFor(modelItem => item.Priority) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.DateCreated) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.User.UserName) 
      </td> 
      <td class="mobileview"> 
       @Html.ActionLink("View Job", "Details", new { id = item.JobId }) 
      </td> 
      <td class="mobileview"> 
       @if (item.Data != null) 
       { 
        @Html.ActionLink("View Data", "Details", "AppForms", new { id = item.Data.Id }, null) 
       } 
       else 
       { 
        @Html.DisplayFor(modelItem => item.Status) 
       } 
      </td> 
     </tr> 
    } 

</table> 

<p>Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount</p> 

@Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, filterAddress1 = ViewBag.filterAddress1, filterId = ViewBag.filterId, filterUsername = ViewBag.filterUsername, filterStartDate = ViewBag.filterStartDate, filterFinishDate = ViewBag.filterFinishDate, filterApp = ViewBag.selectedApp, filterContract = ViewBag.selectedContract }), PagedListRenderOptions.Classic) 

JobsController.cs:

public ActionResult Index(string sortOrder, string currentFilter, string filterId, string filterAddress1, int? page, String filterApp, String filterContract, DateTime? filterStartDate, DateTime? filterFinishDate, String filterUsername) 
{ 
    //...Other filtering 

    //Filter by date 
    if (filterStartDate != null) 
    { 
     jobs = jobs.Where(x => x.DateCreated >= filterStartDate); 
     //ViewBag.filterStartDate = filterStartDate.Value.Year + "-" + filterStartDate.Value.Month + "-" + filterStartDate.Value.Day; 
     ViewBag.filterStartDate = filterStartDate; 
    } 

    if (filterFinishDate != null) 
    { 
     //Make sure we're checking to the end of the end date (ie 01/01/2015 23:59:59) 
     filterFinishDate = filterFinishDate.Value.AddHours(23).AddMinutes(59).AddSeconds(59); 
     jobs = jobs.Where(x => x.DateCreated <= filterFinishDate); 
     //ViewBag.filterFinishDate = filterFinishDate.Value.Year + "-" + filterFinishDate.Value.Month + "-" + filterFinishDate.Value.Day; 
     ViewBag.filterFinishDate = filterFinishDate; 
    } 

    int pageSize = int.Parse(ConfigurationManager.AppSettings["MaxPageItemCount"]); 
    int pageNumber = page ?? 1; 

    return this.View(jobs.ToPagedList(pageNumber, pageSize)); 
} 
+0

作业从索引操作返回时是否正确排序? – derape 2015-03-31 08:45:21

+0

我现在实际上没有使用任何排序。 sortOrder当前未被使用。相反,我只是通过DateCreated DESC对它们全部进行排序,但是我选择忽略那一行代码,因为我认为它对于我遇到的问题并不重要。 – 2015-03-31 09:04:27

回答

1

@Html.TextBox()可以拉值出的ModelState或ViewData的的。

尝试手动建立HTML的日期输入这样的:

<input type="date" name="filterStartDate" id="filterStartDate" class="form-control date" value="@ViewBag.filterStartDate.ToString("yyyy-MM-dd")"/> 
+1

此解决方案已正常工作。我感谢你分享你难以置信的知识和专业知识。 – 2015-03-31 13:35:49

0

解决了这个问题通过手动创建日期输入而TAHN依靠剃须刀为我做!

   @if (ViewBag.filterStartDate != null) 
       { 
        <input type="date" name="filterStartDate" id="filterStartDate" value="@ViewBag.filterStartDate.ToString("yyyy-MM-dd")" /> 
       } 
       else 
       { 
        <input type="date" name="filterStartDate" id="filterStartDate" value="" /> 
       }