获取参数源时出错,在索引页上创建搜索时出错

Getting a Parameter Source Error Creating Search on Index Page

提问人:MelB 提问时间:7/19/2023 最后编辑:MelB 更新时间:7/20/2023 访问量:37

问:

我正在尝试创建一个具有开始和结束日期范围以及下拉列表的搜索,用户可以在其中选择一个(或多个)城市以在索引页面搜索中返回。单独进行日期搜索效果很好,但是当我尝试添加下拉列表(来自用户的额外请求)时,出现以下错误:

处理请求时发生未处理的异常。 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();
    }
}

我对编码还比较陌生,并且认为我可能错过了一个步骤,有一些我不应该有的额外东西,等等。不确定我是否为多个选择正确设置了下拉列表(尽管它允许我选择多个)。

我在这里搜索并浏览了其他几个有此参数错误的帖子,但不了解所有回复或它们如何应用于我自己的实例。如果有人能看一看并帮助我,我将不胜感激。

谢谢。

C# asp.net 参数 razor-pages nullreferenceexception

评论

0赞 jdweng 7/19/2023
您有一个cookie问题:“堆栈查询Cookie标头路由” 请参阅:learnrazorpages.com/razor-pages/cookies
0赞 MelB 7/19/2023
@jdweng谢谢。你能详细说明一下吗?我阅读了链接,但不确定我是否理解。我是否需要将 Cookie 设置为提前过期?我需要对他们做什么?禁用、启用、过期?我不明白cookie的问题是什么。
0赞 Mike Brind 7/19/2023
@jdweng “Stack Query Cookie Headers Routing”是标准开发人员错误页面上的选项卡标题。在我看来,它们已包含在错误消息复制/粘贴中。
0赞 jdweng 7/19/2023
@MikeBrind : 正在使用旧的cookie,并且代码已更改。旧的 Cookie 需要更新
0赞 Mike Brind 7/20/2023
@jdweng OPs 代码中没有 cookie。

答:

1赞 Mike Brind 7/19/2023 #1

您忘记在处理程序中重新填充。框架尝试重新显示包含表单的页面,其中包括不存在的选择选项。DisplayRefMunisOnPost

对页面的每个请求都是独立的,并且请求之间不会维护任何状态,因此,无论用于请求页面的 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 是的,您应该将其作为另一个问题发布。