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

Razor Pages应用UI值提交问题:空引用异常求助

解决步骤与代码示例

1. 定义模型类

先确保技能(Capability)和评分项(ScoreEntry)的模型类已正确定义:

public class Capability
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class ScoreEntry
{
    public int CapabilityId { get; set; }
    public int Score { get; set; }
}

2. 在PageModel中初始化集合

在Razor Page的后端代码(.cshtml.cs文件)里,必须在OnGet方法中同时初始化技能列表和对应的评分列表,保证每个技能都有匹配的评分项:

public class CapabilityRatingModel : PageModel
{
    // 展示用的技能列表
    public List<Capability> Capabilities { get; set; }
    // 用于绑定用户输入的评分列表,需加[BindProperty]实现自动绑定
    [BindProperty]
    public List<ScoreEntry> Scores { get; set; }

    public async Task OnGet()
    {
        // 从Web API或数据库获取技能数据(示例用模拟数据)
        Capabilities = await FetchCapabilities();
        
        // 初始化评分列表,每个技能对应一个空的评分项
        Scores = Capabilities.Select(c => new ScoreEntry { CapabilityId = c.Id }).ToList();
    }

    // 模拟获取技能数据的方法
    private Task<List<Capability>> FetchCapabilities()
    {
        return Task.FromResult(new List<Capability>
        {
            new Capability { Id = 1, Name = "C#开发" },
            new Capability { Id = 2, Name = "ASP.NET Core" },
            new Capability { Id = 3, Name = "数据库设计" }
        });
    }

    // 提交评分的Post方法
    public async Task<IActionResult> OnPost()
    {
        if (!ModelState.IsValid)
        {
            // 验证失败时重新加载技能列表,避免视图报错
            Capabilities = await FetchCapabilities();
            return Page();
        }

        // 调用Web API将评分提交到数据库
        await SubmitScoresToDatabase(Scores);
        return RedirectToPage("/RatingSuccess");
    }

    // 模拟提交评分到API的方法
    private Task SubmitScoresToDatabase(List<ScoreEntry> scores)
    {
        // 这里写实际的API调用逻辑
        return Task.CompletedTask;
    }
}

3. 视图(.cshtml)中正确绑定

在视图里循环技能列表,通过index关联技能和对应的评分项,确保绑定路径有效:

@page
@model CapabilityRatingModel

<form method="post">
    <h3>技能评分</h3>
    @for (int index = 0; index < Model.Capabilities.Count; index++)
    {
        <div class="mb-3">
            <label class="form-label">@Model.Capabilities[index].Name</label>
            <!-- 绑定已初始化的评分项,不会触发空引用异常 -->
            <input type="number" asp-for="Scores[index].Score" min="0" max="10" class="form-control" />
            <!-- 隐藏字段保存技能ID,确保提交时能关联到对应技能 -->
            <input type="hidden" asp-for="Scores[index].CapabilityId" />
        </div>
    }
    <button type="submit" class="btn btn-primary">提交评分</button>
</form>

关键注意点

  • 必须保证Scores列表的长度和Capabilities完全一致,每个技能对应一个ScoreEntry实例,否则视图绑定Scores[index].Score时会触发空引用异常。
  • Scores属性必须标记[BindProperty],否则Post提交时无法自动收集用户输入的评分数据。
  • 若Post提交后模型验证失败,需重新加载Capabilities列表,避免视图因技能数据为空报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:19