[英]mvc pagedlist date loses value on second page
I have an Index page with various filtering options on it, all included within a PagedList. 我有一个索引页面,上面有各种过滤选项,所有这些都包含在PagedList中。 They all appear to be working fine, except for the dates.
除日期外,它们似乎都工作正常。
When I first filter by date, they work fine however when I click on a page number at the bottom, the search criteria for my date is disappearing. 当我第一次按日期过滤时,它们可以正常工作,但是当我单击底部的页码时,我日期的搜索条件就消失了。
I can see that I can passing the search term in the paged list, and I can see this date hit my controller and the filtering happen but the ViewBag.filterStartDate and ViewBag.filterEndDate just aren't binding back to my textboxes for some reason. 我可以看到可以在页面列表中传递搜索词,并且可以看到此日期到达了我的控制器并且发生了过滤,但是由于某种原因,ViewBag.filterStartDate和ViewBag.filterEndDate并没有绑定回我的文本框。
Index.cshtml: 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: 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: 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));
}
@Html.TextBox()
can pull values out of the ModelState or ViewData. @Html.TextBox()
可以将值拉出ModelState或ViewData。
Try building the html for the date input manually like this: 尝试手动为日期输入构建html,如下所示:
<input type="date" name="filterStartDate" id="filterStartDate" class="form-control date" value="@ViewBag.filterStartDate.ToString("yyyy-MM-dd")"/>
Resolved the issue by manually creating the date inputs rather tahn relying on Razor to do it for me! 通过手动创建日期输入解决了该问题,而不是依靠Razor为我完成任务!
@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="" />
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.