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

ASP.NET MVC 5中如何将模型类的可空double转换为double类型

嘿,我来给你几个实用的方案,帮你把ASP.NET MVC 5模型里的可空double转成普通double,都是项目里常用的路子:

方案1:直接修改模型属性类型(最简单直接)

如果你的业务逻辑允许这些属性有默认值(比如0.0),直接把double?改成double就行,还可以给属性设置默认值避免初始化为0以外的情况:

public class ValueAddedTax {
    public int Id { get; set; }
    // 给属性设置默认值,确保即使没赋值也有合法的double值
    public double TaxableGoodsSalePrice { get; set; } = 0.0;
    public double TaxableGoodsSupplementaryDuty { get; set; } = 0.0;
    public double TaxableGoodsValueAddedTax { get; set; } = 0.0;
    public double ZeroRatedSalePrice { get; set; } = 0.0;
    public double ZeroRatedSupplementaryDuty { get; set; } = 0.0;
    public double ZeroRatedValueAddedTax { get; set; } = 0.0;
    public double ExemptSalePrice { get; set; } = 0.0;
    // 其他属性同理
}

⚠️ 注意:如果这个模型对应数据库表,要先检查数据库里的对应字段是否允许NULL。如果允许的话,需要先给现有NULL值设置默认值(比如0),再修改字段为非NULL,不然Entity Framework迁移的时候会报错。

方案2:用GetValueOrDefault()方法(不修改原模型的临时处理)

如果不想改动原模型,在需要使用属性值的地方(比如控制器逻辑、视图渲染),可以用Nullable类型自带的GetValueOrDefault()方法:

// 控制器里的示例:计算含税总价
var model = db.ValueAddedTaxes.Find(id);
double total = model.TaxableGoodsSalePrice.GetValueOrDefault() + model.TaxableGoodsValueAddedTax.GetValueOrDefault();

// 也可以自定义默认值,比如如果是NULL就用1.0而不是0.0
double customDefault = model.ExemptSalePrice.GetValueOrDefault(1.0);

在视图里用的话也一样:

<p>应税货物售价:@Model.TaxableGoodsSalePrice.GetValueOrDefault()</p>
方案3:创建DTO做映射(适合分层架构)

如果你的项目是分层架构(比如有数据访问层、业务逻辑层、表现层),推荐创建一个数据传输对象(DTO),把可空属性转成非空属性,然后通过映射来转换:

首先定义DTO类:

public class ValueAddedTaxDto {
    public int Id { get; set; }
    public double TaxableGoodsSalePrice { get; set; }
    public double TaxableGoodsSupplementaryDuty { get; set; }
    // 其他非空double属性...
}

然后手动映射或者用AutoMapper:

手动映射示例:

var originalModel = db.ValueAddedTaxes.Find(id);
var dto = new ValueAddedTaxDto {
    Id = originalModel.Id,
    // 用空合并运算符??给NULL设置默认值0.0
    TaxableGoodsSalePrice = originalModel.TaxableGoodsSalePrice ?? 0.0,
    TaxableGoodsSupplementaryDuty = originalModel.TaxableGoodsSupplementaryDuty ?? 0.0,
    // 其他属性同理
};

AutoMapper配置示例:

如果用AutoMapper,可以一次性配置好映射规则,不用每次手动写:

// 在AutoMapper配置类里
CreateMap<ValueAddedTax, ValueAddedTaxDto>()
    .ForMember(dest => dest.TaxableGoodsSalePrice, opt => opt.MapFrom(src => src.TaxableGoodsSalePrice ?? 0.0))
    .ForMember(dest => dest.TaxableGoodsSupplementaryDuty, opt => opt.MapFrom(src => src.TaxableGoodsSupplementaryDuty ?? 0.0))
    // 其他属性的映射规则...
方案4:添加非空包装属性(逐步过渡)

如果不想一次性改动所有代码,可以在原模型里添加非空的包装属性,原有代码继续用可空属性,新代码用包装属性:

public class ValueAddedTax {
    public int Id { get; set; }
    public double? TaxableGoodsSalePrice { get; set; }
    public double? TaxableGoodsSupplementaryDuty { get; set; }
    // 其他可空属性...

    // 添加非空包装属性,用空合并运算符处理NULL
    public double TaxableGoodsSalePriceNonNullable => TaxableGoodsSalePrice ?? 0.0;
    public double TaxableGoodsSupplementaryDutyNonNullable => TaxableGoodsSupplementaryDuty ?? 0.0;
    // 其他包装属性...
}

这样可以逐步把代码里的可空属性替换成包装属性,完成过渡后再删掉原来的可空属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:55:27