我正在构建一个包含3个部分的搜索页面,用户可以从中回发。
1)搜索条件表单,其中包含搜索字段和类型为提交的搜索按钮标记帮助程序。它具有以下属性:asp-route-newSearch =“true”
<button asp-route-newSearch="true" type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-search"></span>
Search
</button>
2)具有锚标记助手和asp-route-QuickSearchType属性的快速搜索区域。快速搜索的值可以是“已完成”,“已解决”等状态。
这里的链接如下:
<a asp-controller="InternalAudit" asp-action="Index" asp-route-QuickSearchType="Unresolved" class="quick-search-link">
<i class="fa fa-clipboard"></i>View Unresolved Audits
</a>
3)寻呼机部分,用户选择页码并单击GO。 Go也是一个标签帮助按钮
<button type="submit" class="btn btn-default btn-sm">
GO
</button>
外形如下:
<form asp-controller="InternalAudit" asp-action="Index" class="form-horizontal">
以下是我的错误流程:
当我第一次进入页面时,它看起来像这样:
现在我搜索,屏幕看起来像这样:
我从模型中写出了PageNum。它说一个和Pager Dropdown是1。 现在,如果我将Pager下拉到3并单击GO,它看起来是正确的。 GO作为第二个提交按钮在这里工作。
现在,如果我更改搜索条件并单击搜索,您可以看到我在哪里写出正确的模型var PageNum 1。 但是下拉列表仍在第3页。
[![在此输入图像说明] [4]] [4]
这是我的控制器和行动签名:
public class InternalAuditController : Controller
{
private IOfficeRepository _OfficeRepo;
private IInternalAuditRepository _internalAuditRepo;
public InternalAuditController(IInternalAuditRepository internalAuditRepo, IOfficeRepository officeRepo)
{
_internalAuditRepo = internalAuditRepo;
_OfficeRepo = officeRepo;
}
public ViewResult Index(InternalAuditListVM internalAuditListVM, bool newSearch)
{
在下一节中,如果这是新搜索或第一次点击页面,我会将寻呼信息重置为PageNum 1。 如果这是一个新的搜索,请将“快速搜索”设为空:
var internalAudits = _internalAuditRepo.InternalAudits;
// First hit or new search: need to initialize PageNum to 1;
if (internalAuditListVM.PagingInfo == null || newSearch == true)
{
internalAuditListVM.PagingInfo = new PagingInfo();
}
if (newSearch == true)
{
internalAuditListVM.QuickSearchType = null;
}
以下是快速搜索部分:
#region QuickSearching
if (internalAuditListVM.QuickSearchType != null)
{
internalAuditListVM.InternalAuditSearchCriteria = null;
internalAudits = internalAudits.Where(ia => ia.Status == internalAuditListVM.QuickSearchType);
}
#endregion
然后是几个看起来像这样的过滤部分:
string auditAcnSearchText = internalAuditListVM.InternalAuditSearchCriteria?.AuditAcnCd;
if (!String.IsNullOrEmpty(auditAcnSearchText))
{
internalAudits = internalAudits.Where(ia => ia.AuditAcnCd.Contains(auditAcnSearchText));
}
然后我准备了下拉菜单:
#region Prepare SelectLists for Drop Downs
IQueryable<SelectListItem> offices = _OfficeRepo.Offices.OrderBy(o => o.OfficeOrganizationCd)
.Where(o => o.OfficeActiveCd == "Y")
.Select(o => new SelectListItem
{ Text = o.OfficeOrganizationCd, Value = o.OfficeID.ToString() });
IQueryable<SelectListItem> issuers = _internalAuditRepo.InternalAudits
.OrderBy(i => i.Issuer)
.Select(a => new SelectListItem { Text = a.Issuer }).Distinct();
#endregion
准备VM并像这样返回;
internalAuditListVM.InternalAudits = internalAudits;
internalAuditListVM.OfficeList = offices.ToList();
internalAuditListVM.IssuerList = issuers.ToList();
return
return View(internalAuditListVM);
当我点击“搜索”时,有人知道为什么Select标签助手没有绑定吗?
我现在有静态标签,因为我还在处理分页。
我的问题还有第二部分。
从我在我的错误流程中停止的地方,如果我现在点击“未解决的”快速搜索链接,我会看到此屏幕。
[![在此处输入图像说明] [5]] [5]
在我的调试模型写出区域和搜索结果中,PageNum为1且Quicksearch为“未解析”。 现在,如果我从下拉菜单中选择第2页并点击“开始”,我会看到此屏幕:
未解决的问题。一切都是正确的。
现在我开始新的搜索:
我得到这个屏幕:
因此调试写出说明Page 1和QuickSearch:NULL是正确的。 但是屏幕在下拉列表中选择了第2页。 最后这是bug最糟糕的部分。 现在,如果我点击GO,它将返回Unresolved。我的QuickSearch如何从两次点击前恢复到模型中的旧值?:
以下是我的ViewModel供参考
public class InternalAuditListVM
{
public InternalAuditSearchCriteria InternalAuditSearchCriteria { get; set; }
public string QuickSearchType { get; set; }
public PagingInfo PagingInfo { get; set; }
public IEnumerable<InternalAudit> InternalAudits { get; set; }
public List<SelectListItem> OfficeList;
public List<SelectListItem> IssuerList;
}
public class InternalAuditSearchCriteria
{
[Display(Name = "Audit Control Number:")]
public string AuditAcnCd { get; set; }
public string Title { get; set; }
public int OfficeId { get; set; }
public string Issuer { get; set; }
}
public class PagingInfo
{
public int TotalItems { get; set; }
public int PageSize { get; set; } = 4;
public int PageNum { get; set; } = 1;
public int TotalPages =>
(int)Math.Ceiling((decimal)TotalItems / PageSize);
}
答案 0 :(得分:1)
很抱歉这篇长篇文章。但是当我把它写出来时似乎总是有帮助。
这是我在开始设置控制器时所做的修改:
var internalAudits = _internalAuditRepo.InternalAudits;
// First hit or new search: need to initialize PageNum to 1;
if (internalAuditListVM.PagingInfo == null || newSearch == true)
{
ModelState.Remove("PagingInfo.PageNum");
internalAuditListVM.PagingInfo = new PagingInfo();
}
if (newSearch == true)
{
ModelState.Remove("QuickSearchType");
internalAuditListVM.QuickSearchType = null;
}
我添加了这两行:
ModelState.Remove("PagingInfo.PageNum");
和
ModelState.Remove("QuickSearchType");
在堆栈上有一些线程可以讨论这个问题,但在我被骗了好几个小时之前,我无法让它工作。 至少我现在有一个小小的想法,并且在它出现时处理这个错误的一点经验。