提问人:MelB 提问时间:7/19/2023 最后编辑:MelB 更新时间:7/20/2023 访问量:37
获取参数源时出错,在索引页上创建搜索时出错
Getting a Parameter Source Error Creating Search on Index Page
问:
我正在尝试创建一个具有开始和结束日期范围以及下拉列表的搜索,用户可以在其中选择一个(或多个)城市以在索引页面搜索中返回。单独进行日期搜索效果很好,但是当我尝试添加下拉列表(来自用户的额外请求)时,出现以下错误:
处理请求时发生未处理的异常。 ArgumentNullException:值不能为空。(参数 'source')
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument 参数)
Stack Query Cookies Headers Routing
ArgumentNullException: Value cannot be null. (Parameter 'source')
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
System.Linq.OrderedEnumerable<TElement, TKey>..ctor(IEnumerable<TElement> source, Func<TElement, TKey> keySelector, IComparer<TKey> comparer, bool descending, OrderedEnumerable<TElement> parent)
System.Linq.Enumerable.OrderBy<TSource, TKey>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
Referrals.Pages.Reports.AllMunisListing.Pages_Reports_AllMunisListing_Index.<ExecuteAsync>b__21_1()...
这是我的index.cshtml部分,问题所在:
<form asp-page="./Index" method="post">
<div class="form-actions no-color">
<p>
<table id="ReferralTable" class="table table-borderless" style="width:100%">
<tr>
<td width="100%">
Select Beginning Date Received: <input type="date" name="startdate" value="" /> and Ending Date Received: <input type="date" name="enddate" value="" />
</td>
</tr>
</table>
<table id="ReferralTable" class="table table-borderless" style="width:100%">
<tr>
<td width="25%">
Select Municipality(ities):
<select asp-for="TempData" name="searchmuni" id="Select1" style="width: 250px" class="form-select" asp-items="@(new SelectList(Model.DisplayRefMunis.OrderBy(x => x.Id),"Name", "Name"))"><option value="Name" selected disabled>---Select Municipality(ies)---</option></select>
</td>
<td width="75%">
<input type="submit" value="Search" class="btn btn-primary mx-2" />
<a asp-page="./Index" class="btn btn-link mx-2">Return to Full List</a>
</td>
</tr>
</table>
</p>
</div>
这是我背后的.cs:
using Referrals.Data;
using Referrals.Model;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
namespace Referrals.Pages.Reports.AllMunisListing;
public class IndexModel : PageModel
{
private readonly ApplicationDbContext _db;
public IndexModel(ApplicationDbContext db)
{
_db = db;
}
public IEnumerable<Referral> Results { get; set; }
public IEnumerable<Municipality> DisplayRefMunis { get; set; }
public string DateReceivedSort { get; set; }
public async Task OnGet()
{
Results = _db.Referral.ToList();
await _db.Municipality.Select(a => a.Name).ToListAsync();
DisplayRefMunis = await _db.Municipality.ToListAsync();
}
public async Task<IActionResult> OnPost(DateTime startdate, DateTime enddate, string searchmuni, string sortOrder)
{
Results = (from x in _db.Referral where (x.DateReceived >= startdate) && (x.DateReceived <= enddate) && x.RefMunicipality.Contains(searchmuni) select x).ToList();
DateReceivedSort = sortOrder == "DateReceived_Asc_Sort" ? "DateReceived_Desc_Sort" : "DateReceived_Asc_Sort";
switch (sortOrder)
{
case "DateReceived_Asc_Sort":
Results = Results.OrderBy(s => s.DateReceived);
break;
case "DateReceived_Desc_Sort":
Results = Results.OrderByDescending(s => s.DateReceived);
break;
default:
Results = Results.OrderBy(s => s.DateReceived);
break;
}
DisplayRefMunis = await _db.Municipality.ToListAsync();
TempData["StartDate"] = startdate.ToShortDateString();
TempData["EndDate"] = enddate.ToShortDateString();
TempData["SearchMuni"] = searchmuni.ToString();
return Page();
}
}
我对编码还比较陌生,并且认为我可能错过了一个步骤,有一些我不应该有的额外东西,等等。不确定我是否为多个选择正确设置了下拉列表(尽管它允许我选择多个)。
我在这里搜索并浏览了其他几个有此参数错误的帖子,但不了解所有回复或它们如何应用于我自己的实例。如果有人能看一看并帮助我,我将不胜感激。
谢谢。
答:
1赞
Mike Brind
7/19/2023
#1
您忘记在处理程序中重新填充。框架尝试重新显示包含表单的页面,其中包括不存在的选择选项。DisplayRefMunis
OnPost
对页面的每个请求都是独立的,并且请求之间不会维护任何状态,因此,无论用于请求页面的 HTTP 方法如何,都必须确保准备好页面所需的所有数据。
复制行
DisplayRefMunis = await _db.Municipality.ToListAsync();
到处理程序来解决问题。OnPost
评论
0赞
MelB
7/19/2023
是的,这奏效了,谢谢,只是现在我显然有另一个问题。我应该在这里还是在另一篇文章中解决它?搜索只返回我选择的第一个城市,而不是我选择的所有城市,所以显然是单选的。我必须更改哪些内容才能使其成为多选?
0赞
MelB
7/20/2023
我已经用我的代码更改更新了.cs。
0赞
MelB
7/20/2023
自言自语,但不知道如何在代码中做到这一点。我是否需要遍历选定的下拉列表?因此,一旦它接受了第一个选择,它就知道要寻找更多的选择吗?
0赞
Mike Brind
7/20/2023
@MelB 是的,您应该将其作为另一个问题发布。
评论