我有一个 Copy.cshtml 页面,它复制现有记录并允许用户基于现有记录创建新记录。通过创建新记录并返回 Index.cshtml,效果很好。我需要帮助的是能够创建记录并返回到通过搜索过滤的 Index.cshtml(从 Copy.cshtml 页面)。
例如用户在Index.cshtml页面中搜索某个客户端的所有记录。然后,他们希望通过单击其中一条记录旁边的“复制”按钮来复制其中一条客户记录,但希望返回到已为该客户筛选的页面,并查看他们添加的新记录以及该客户的其他记录客户。我不知道如何实现这一点。
我的 Copy.cshml 页面上有 3 个链接。第一个是复制记录并返回到所有记录的未过滤索引(现在可以使用),第二个是复制并返回到已过滤索引(我需要帮助),而第三个是仅返回到未过滤的索引索引而不更新任何内容(基本上是取消记录副本,现在也可以使用)。
这是代码:
<div>
<button type="submit" id="CopyRetToIndex" class="btn btn-primary" style="width:150px;">Add Copy</button>
<button type="submit" asp-route-id="searchString" id="CopyRetToFilter" class="btn btn-primary" style="width:300px;">
Add Copy/Return to Filtered Search</button>
<a asp-page="Index" class="btn btn-secondary" style="width: 150px;">Back to List</a>
</div>
在 .cs 方面,我认为我需要某种类型的“if”语句来区分这些按钮,所以到目前为止我已经有了:
public async Task<IActionResult> OnPost()
{
if (ModelState.IsValid)
{
_db.Trip.Add(Trip);
await _db.Trip.AddAsync(Trip);
await _db.SaveChangesAsync();
TempData["success"] = "Trip copied successfully.";
return RedirectToPage("Index");
}
else if (ModelState.IsValid)
{
_db.Trip.Add(Trip);
await _db.Trip.AddAsync(Trip);
await _db.SaveChangesAsync();
TempData["success"] = "Trip copied successfully.";
return RedirectToPage("/Trips?SearchString=");
}
return Page();
}
我在这里进行了研究,只发现一个问题/答案似乎涵盖了我所需要的内容,但我不完全理解如何用我已有的东西来实现它。该帖子说为我的搜索创建一个会话,他们建议的代码是:
public ActionResult Search(string searchCriteria)
{
Session["searchCriteria"] = searchCriteria;
// do more stuff
}
任何帮助将不胜感激。不确定我是否在 Index.cs 或 Copy.cs 上创建此会话信息,因为 Index.cs 是我的搜索来源以及如何在我自己的项目中工作。
我的Index.cs是这样的:
public async Task OnGetAsync(string sortOrder, string searchString)
{
TripSort = sortOrder == "ClientName_Asc_Sort" ? "ClientName_Desc_Sort" : "ClientName_Asc_Sort";
StatusSort = sortOrder == "Status_Asc_Sort" ? "Status_Desc_Sort" : "Status_Asc_Sort";
CurrentFilter = searchString;
IQueryable<Trip> trip = from s in _db.Trip select s;
if (!string.IsNullOrEmpty(searchString))
trip = (IQueryable<Trip>)trip.Where(s => s.ClientName.Contains(searchString) || s.PickUpDriver.Contains(searchString) || s.ReturnDriver.Contains(searchString) || s.PickUpDateTime.Value.ToString().Contains(searchString));
switch (sortOrder)
{
case "ClientName_Asc_Sort":
trip = trip.OrderBy(s => s.ClientName);
break;
case "ClientName_Desc_Sort":
trip = trip.OrderByDescending(s => s.ClientName);
break;
case "Status_Asc_Sort":
trip = trip.OrderBy(s => s.PickUpStatus);
break;
case "Status_Desc_Sort":
trip = trip.OrderByDescending(s => s.PickUpStatus);
break;
default:
trip = trip.OrderBy(s => s.ClientName);
break;
}
Trip = await trip.AsNoTracking().ToListAsync();
}
提前谢谢您!
为下面的评论请求添加了“复制”按钮(我不知道如何使用“复制”按钮专门添加到数据库并返回到过滤后的搜索。)这是一个猜测。
<a asp-page="Copy" asp-route-id="@obj.TripId" class="btn btn-primary mx-2">
<i class="bi bi-clipboard-check"></i>
</a>
我想说的是,在您的
Copy.cshtml.cs
页面中,将过滤器信息添加到 GET 请求中。会是这样的
public async Task OnGetAsync(int copyItemId, string? sortOrder, string? searchString)
{
this.PreviousSortOrder = sortOrder;
this.PreviousSearchString = searchString;
}
然后在 razor 文件
Copy.cshtml
中,使用此信息将按钮定向到预过滤页面,如下所示:
<button type="submit"
asp-page="Index"
asp-route-sortOrder="@Model.PreviousSortOrder"
asp-route-searchString="@Model.PreviousSearchString"
id="CopyRetToFilter">
Add Copy/Return to Filtered Search
</button>
要将其结合在一起,您需要实际将此信息告诉
Copy
页面。例如,通过使用复制按钮:
<a asp-page="Copy"
asp-route-id="@obj.TripId"
asp-route-sortOrder="@Model.StatusSort"
asp-route-searchString="@Model.CurrentFilter">
<i class="bi bi-clipboard-check"></i>
</a>