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

.NET+Ajax场景下拉框选项值无法传递至控制器的问题

问题分析与解决方案

下面是可能导致你遇到空引用错误的几个遗漏点,以及对应的解决方法:

1. 下拉框name属性与ViewModel属性不匹配

模型绑定完全依赖表单元素的name属性,而非id。你需要确保动态生成的下拉框的name,和AdresWijzigenViewModel中用来接收选中ID的属性名称完全一致(包括命名格式,比如ViewModel里是PlaatsId,下拉框就不能写成plaatsId或者NieuwPlaatsId)。

举个例子,ViewModel里应该有专门接收ID的属性:

public class AdresWijzigenViewModel
{
    // 用来接收下拉框提交的ID值
    public int PlaatsId { get; set; }
    public Plaats nieuwPlaats { get; set; }
}

对应的下拉框必须设置正确的name:

<select name="PlaatsId" id="plaatsDropdown">
    <!-- Ajax生成的<option value="xxx">...</option> -->
</select>

2. ViewModel关联对象未初始化

如果你的ViewModel里直接包含Plaats类型的nieuwPlaats属性,默认情况下这个属性是null——模型绑定只会填充nieuwPlaats.PlaatsId(如果下拉框name是nieuwPlaats.PlaatsId),但不会自动创建nieuwPlaats的实例。

解决方法:在ViewModel的构造函数里初始化该对象:

public class AdresWijzigenViewModel
{
    public Plaats nieuwPlaats { get; set; }

    public AdresWijzigenViewModel()
    {
        // 初始化避免空引用
        nieuwPlaats = new Plaats();
    }
}

3. 未手动查询填充关联对象

如果你的业务需要完整的Plaats对象(比如访问PlaatsNaam),仅靠模型绑定是不够的——表单提交的只有ID值,不会自动从数据库拉取完整数据。

你需要在控制器方法里,根据提交的ID去数据库查询,填充nieuwPlaats:

[HttpPost]
public IActionResult WijzigingAdresBevestigen(AdresWijzigenViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // 根据提交的ID查询完整的Plaats对象
    model.nieuwPlaats = _plaatsRepository.GetById(model.PlaatsId);

    // 此时可以安全访问model.nieuwPlaats.PlaatsNaam
    var plaatsNaam = model.nieuwPlaats.PlaatsNaam;

    // 后续业务逻辑
    return RedirectToAction("Bevestigd");
}

4. 动态元素未被表单包含

如果是普通表单提交,要确保动态生成的下拉框是<form>标签的子元素;如果是Ajax提交,要确认序列化表单时包含了该下拉框(比如不要把下拉框放在form外面,或者手动把值加入序列化数据)。

5. 模型验证失败

先检查控制器里的ModelState.IsValid,如果验证不通过,查看具体错误——比如下拉框未选中任何值、ID类型不匹配(比如ViewModel里是int但提交了非数字值),这些都会导致模型绑定失败,进而让关联对象保持null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:10:25