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
相关产品推荐
相关产品推荐

