You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建Index页面搜索时触发Parameter Source空引用异常

问题排查与解决方案

核心异常原因

ArgumentNullException 是由于Linq的OrderBy方法接收了null作为数据源,结合代码和堆栈信息,主要有两个触发点:

  1. 视图中构建下拉框时,Model.DisplayRefMunis为null,调用OrderBy(x => x.Id)时抛出异常
  2. OnPost方法中查询得到的Results为null,后续排序时触发异常

具体问题分析

  1. 下拉框配置错误

    • 视图中select标签绑定了TempData(asp-for="TempData"),这是错误的,TempData不能作为表单绑定目标
    • 未添加multiple属性,实际无法支持多选
    • 默认选项设置了disabled,用户未选择市政时,表单不会提交任何值,导致后台接收的市政参数为null
  2. 查询逻辑未处理空值

    • 当市政参数为null时,x.RefMunicipality.Contains(searchmuni)会导致EF查询异常,进而让Results未被正确赋值(保持null)
    • 未验证模型绑定状态,日期控件未填写时,startdate/enddate会被绑定为DateTime.MinValue,可能导致无匹配结果
  3. 未初始化集合

    • Results和DisplayRefMunis未在构造函数中初始化为空集合,出现异常时会保持null

分步修复

1. 修正PageModel代码

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;
        // 初始化集合,避免null引用
        Results = Enumerable.Empty<Referral>();
        DisplayRefMunis = Enumerable.Empty<Municipality>();
        SelectedMunis = new List<string>();
    }

    public IEnumerable<Referral> Results { get; set; }
    public IEnumerable<Municipality> DisplayRefMunis { get; set; }
    public string DateReceivedSort { get; set; }
    // 用于接收多选的市政值
    [BindProperty]
    public List<string> SelectedMunis { get; set; }

    public async Task OnGet()
    {
        Results = await _db.Referral.ToListAsync();
        DisplayRefMunis = await _db.Municipality.OrderBy(x => x.Id).ToListAsync();
    }

    public async Task<IActionResult> OnPost(string sortOrder)
    {
        // 手动解析日期参数,避免模型绑定失败
        DateTime.TryParse(Request.Form["startdate"], out DateTime startdate);
        DateTime.TryParse(Request.Form["enddate"], out DateTime enddate);

        // 构建基础查询
        var query = _db.Referral.AsQueryable();

        // 日期筛选:仅当日期有效时添加条件
        if (startdate != default)
        {
            query = query.Where(x => x.DateReceived >= startdate);
        }
        if (enddate != default)
        {
            query = query.Where(x => x.DateReceived <= enddate);
        }

        // 市政筛选:多选处理,空值时跳过条件
        if (SelectedMunis != null && SelectedMunis.Any())
        {
            query = query.Where(x => SelectedMunis.Contains(x.RefMunicipality));
        }

        // 排序逻辑
        DateReceivedSort = sortOrder == "DateReceived_Asc_Sort" ? "DateReceived_Desc_Sort" : "DateReceived_Asc_Sort";
        query = sortOrder switch
        {
            "DateReceived_Asc_Sort" => query.OrderBy(s => s.DateReceived),
            "DateReceived_Desc_Sort" => query.OrderByDescending(s => s.DateReceived),
            _ => query.OrderBy(s => s.DateReceived)
        };

        // 执行查询并赋值
        Results = await query.ToListAsync();
        DisplayRefMunis = await _db.Municipality.OrderBy(x => x.Id).ToListAsync();

        // 保存查询条件到TempData
        if (startdate != default)
            TempData["StartDate"] = startdate.ToShortDateString();
        if (enddate != default)
            TempData["EndDate"] = enddate.ToShortDateString();
        if (SelectedMunis.Any())
            TempData["SearchMuni"] = string.Join(", ", SelectedMunis);

        return Page();
    }
}

2. 修正视图(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="@TempData["StartDate"]" /> 
                        and Ending Date Received: 
                        <input type="date" name="enddate" value="@TempData["EndDate"]" />
                    </td>
                </tr>
            </table>
            <table id="ReferralTable" class="table table-borderless" style="width:100%">
                <tr>
                    <td width="25%">
                        Select Municipality(ies):
                        <!-- 添加multiple属性支持多选,绑定到正确的PageModel属性 -->
                        <select asp-for="SelectedMunis" multiple="multiple" style="width: 250px" class="form-select" 
                                asp-items="@(new SelectList(Model.DisplayRefMunis, "Name", "Name"))">
                            <option value="" 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>
</form>

关键修复点说明

  1. 集合初始化:在构造函数中初始化所有集合属性,彻底避免null引用异常
  2. 多选支持:使用List<string>类型接收多选值,视图中添加multiple属性实现真正的多选功能
  3. 查询逻辑优化:拆分查询构建流程,空值时自动跳过对应筛选条件,避免无效查询
  4. 参数处理:手动解析日期参数,避免模型绑定失败导致的异常
  5. 视图绑定修正:移除错误的TempData绑定,替换为正确的PageModel属性绑定

内容的提问来源于stack exchange,提问作者MelB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:54:52