ASP.Net Core第二个提交按钮带回旧模型数据

时间:2018-01-22 15:55:56

标签: c# asp.net-core model-binding asp.net-core-tag-helpers

我正在构建一个包含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">

以下是我的错误流程:

当我第一次进入页面时,它看起来像这样:

enter image description here

现在我搜索,屏幕看起来像这样:

enter image description here

我从模型中写出了PageNum。它说一个和Pager Dropdown是1。 现在,如果我将Pager下拉到3并单击GO,它看起来是正确的。 GO作为第二个提交按钮在这里工作。

enter image description here

现在,如果我更改搜索条件并单击搜索,您可以看到我在哪里写出正确的模型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页并点击“开始”,我会看到此屏幕:

enter image description here

未解决的问题。一切都是正确的。

现在我开始新的搜索:

我得到这个屏幕:

enter image description here

因此调试写出说明Page 1和QuickSearch:NULL是正确的。 但是屏幕在下拉列表中选择了第2页。 最后这是bug最糟糕的部分。 现在,如果我点击GO,它将返回Unresolved。我的QuickSearch如何从两次点击前恢复到模型中的旧值?:

enter image description here

以下是我的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);
    }

1 个答案:

答案 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");

在堆栈上有一些线程可以讨论这个问题,但在我被骗了好几个小时之前,我无法让它工作。 至少我现在有一个小小的想法,并且在它出现时处理这个错误的一点经验。