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

ASP.NET MVC数据注解:初始数据为NULL但提交需必填值的问题

解决方案:在ASP.NET MVC中处理初始NULL字段的必填验证问题

问题原因

添加[Required]注解后,Database.SqlQuery<T>会依据数据注解推断字段为非空类型,但数据库返回的Notes值为NULL,导致映射时抛出SqlNullValueException。

可行解决方法

方法1:拆分读取与提交模型

创建两个职责明确的模型,分别用于数据库数据读取和表单提交验证,避免注解冲突:

读取模型(用于从数据库获取数据)

public class DetailReadModel
{
    // 其他属性...
    public string? Notes { get; set; }
}

提交模型(用于表单验证)

public class DetailEditModel
{
    // 其他属性...
    [Required(ErrorMessage = "Notes字段为必填项")]
    public string Notes { get; set; } = string.Empty;
}

控制器调整

public async Task<ActionResult?> Detail(string? id)
{
   DetailReadModel? detailRead = await _StoredProcedures.GetDetail(id);
   // 转换为编辑模型,将NULL转为空字符串
   DetailEditModel detailEdit = new DetailEditModel
   {
       // 赋值其他属性...
       Notes = detailRead?.Notes ?? string.Empty
   };
   return View(detailEdit);
}

// 修改存储过程调用方法的返回类型
public async Task<DetailReadModel?> GetDetail(string? id)
{
    List<DetailReadModel> info = await _context.Database.SqlQuery<DetailReadModel>($@"EXECUTE [dbo].[p_DetailView] @Method = 'Info', @RecID = {id}").ToListAsync();
    return info.FirstOrDefault();
}

方法2:修改存储过程返回空字符串替代NULL

在存储过程p_DetailView中,用ISNULL函数将Notes字段的NULL值转换为空字符串:

-- 存储过程中调整Notes字段的返回逻辑
SELECT 
    -- 其他字段...
    ISNULL(Notes, '') AS Notes
FROM YourTable
-- 其余业务逻辑...

之后模型可保留[Required]注解,读取时数据库返回空字符串而非NULL,不会触发映射异常,同时[Required]会在表单提交时拦截空输入:

public class DetailModel
{
    // 其他属性...
    [Required(ErrorMessage = "Notes字段为必填项")]
    public string? Notes { get; set; }
}

说明

  • 方法1的优势是模型职责分离,适合字段较多、逻辑复杂的场景;方法2更轻量化,无需修改C#代码,仅调整存储过程即可实现需求。
  • 两种方法都能达成目标:初始数据为NULL时正常加载编辑页面,表单提交时强制验证Notes为必填项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:52:44