【发布时间】:2021-01-21 21:56:22
【问题描述】:
下午好,我整天都在阅读论坛、博客等,试图找出解决我的问题的方法,但没有一个是一针见血的。
我的场景:我正在尝试按日期范围过滤搜索结果。我希望用户能够搜索特定记录并使用日期范围过滤该搜索。或者,我希望他们能够在不提供搜索条件的情况下查看某个日期范围内的所有记录。
视图模型
public class VMSpecialCollectionSearch
{
// results of search query
public List<ArchivesFileManagement_MVCDB.SpecialCollections> SearchResults { get; internal set; }
public SelectList TypeOptions { get; set; }
// Selected search options
[Required]
public string SearchType { get; set; }
[Required]
public string SearchText { get; set; }
public string CurrentFilter { get; set; }
public DateTime? FromDate { get; set; }
public DateTime? ToDate { get; set; }
}
表单 - 注意:第一个表单可以正常运行并相应地返回我的搜索结果。
<form class="form-group" onsubmit="return validateSelection()">
<div class="card-body">
<div class="row justify-content-center">
<div class="col-md-auto">
<label>Type:</label>
<select id="searchTypeSelection" asp-for="SearchType" asp-items=@Model.TypeOptions required></select>
</div>
<div class="col-md-auto">
<label>Description:</label>
<input id="searchText" type="text" asp-for="SearchText" required />
</div>
<div class="col-md-auto">
<button type="submit" class="btn btn-primary btn-sm">Search</button>
</div>
</div>
</div>
</form>
<form id="dateForm" onsubmit="ApplyDateFilter(event)" class="form-group">
<div class="row justify-content-center">
<div class="col-md-auto">
<label>From:</label>
<input id="fromDate" type="text" asp-for="FromDate" class="datePicker" required />
</div>
<div class="col-md-auto">
<label>To:</label>
<input id="toDate" type="text" asp-for="ToDate" class="datePicker" required />
</div>
<div class="col-md-auto">
<button class="btn btn-primary btn-sm" type="submit">Apply</button>
</div>
</div>
</form>
处理日期过滤器提交 - 注意:我也尝试将其设置为 Post 方法,但这也不起作用。
function ApplyDateFilter(e) {
e.preventDefault();
//var formData = new FormData($("#dateForm").get(0));
var from = $("#fromDate").val();
var to = $("#toDate").val();
var type = $("#searchTypeSelection").val();
var text = $("#searchText").val();
debugger;
$.ajax({
type: "Get",
url: '@Url.Action("IndexFilter", "SpecialCollections")',
data: //formData,
{
FromDate: from,
ToDate: to,
SearchType: type,
SearchText: text
},
contentType: "application/json",
});
}
控制器
// GET: SpecialCollections/
public IActionResult IndexFilter(string FromDate, string ToDate, string SearchType, string SearchText)
{ ... CREATE AN UPDATED VIEW MODEL ...
return View(nameof(Index), vm);
}
我的问题:提交第二个表单(针对日期范围)后,当我返回视图时,我没有返回新的搜索查询结果。它给了我与以前相同的结果。有没有更好的方法来处理这种情况?
这是我尝试过的... 我尝试将搜索结果实现为部分视图,这样我就可以在不重新加载页面的情况下更新结果。这失败了,因为我在结果表中的所有按钮都坏了。 (我尝试使用委托来解决这个问题,但无济于事)。我目前正在尝试以不同的操作处理第二个表单提交,然后使用新的视图模型重新加载相同的视图(索引)。
除了搜索结果没有改变外,一切似乎都正常。我没有收到任何错误。
【问题讨论】:
-
您是否在 IndexFilter 操作的第一行设置了断点,以验证您的 JSON 有效负载是否正确映射到这些操作参数?我很确定您可能需要使用 [FromBody] 标签将请求正文映射到您的操作参数。
-
@tnk479 我在测试时确实在控制器中放置了断点,以确保控制器按预期运行。它检查得很好。我对 [FromBody] 标签的理解是如何使用我的 ViewModel 作为参数。不过我对此并不完全确定。
标签: c# ajax asp.net-core-mvc