我在asp.net MVC 5项目中有很多可以为空的双重属性的模型类
public class ValueAddedTax
{
public int Id { get; set; }
public double? TaxableGoodsSalePrice { get; set; }
public double? TaxableGoodsSupplementaryDuty { get; set; }
public double? TaxableGoodsValueAddedTax { get; set; }
public double? ZeroRatedSalePrice { get; set; }
public double? ZeroRatedSupplementaryDuty { get; set; }
public double? ZeroRatedValueAddedTax { get; set; }
public double? ExemptSalePrice { get; set; }
public double? ExemptSupplementaryDuty { get; set; }
public double? ExemptValueAddedTax { get; set; }
public double? TotalTaxPayable { get; set; }
}
现在在控制器中我想创建局部变量并尝试将所有属性数据分配到其中
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddTaxInfo(ValueAddedTax valueAddedTax, int? id)
{
// Assagin Data
double taxableGoodsSalePrice = valueAddedTax.TaxableGoodsSalePrice;
if (!ModelState.IsValid)
{
if (valueAddedTax.CustomerInfoId != 0)
return RedirectToAction("ValueAddedTax", "Customer", new {id = valueAddedTax.CustomerInfoId});
return RedirectToAction("Index", "Customer");
}
}
如果任何属性值为null,那么我希望它们在局部变量中为0,以便我可以计算。 我怎么能这样做?
答案 0 :(得分:1)
如果你自己编写逻辑,你需要的东西是:
// if this Nullable has an actual value...
if (valueAddedTax.TaxableGoodsSalePrice.HasValue)
{
// ...return the Nullable's value
return valueAddedTax.TaxableGoodsSalePrice.Value;
}
else
{
// return the default value of the double value type
return default(double); // 0.0D
}
..这几乎是内置Nullable<T>.GetValueOrDefault()
可以为您做的事情:
“返回:
如果HasValue属性为
true
,则Value属性的值;否则,当前Nullable对象的默认值。默认值的类型是当前Nullable对象的type参数,默认值的值仅由二进制零组成。“
答案 1 :(得分:1)
利用trashrOx 的答案,但采用更简洁的方法。
如果您运行的是 C# >= 7.2,您可以使用条件运算符:
double notNullVersion = ValueAddedTax.TaxableGoodsSalePrice.HasValue ? (double)ValueAddedTax.TaxableGoodsSalePrice : 0.0D;
文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
或者,如果您运行的是 C# >= 8.0,您可以简单地使用空合并运算符:
double notNullVersion = ValueAddedTax.TaxableGoodsSalePrice ?? 0.0D;
文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator
我个人认为这些方法在代码中更容易阅读。希望这对某个地方的 S.O.er 有帮助!
答案 2 :(得分:0)
尽管问题的答案是正确的,但微软对此提出了不同的方法。我写在这里是为了将来的读者。
根据 Microsoft 的说法,default
关键字为 Nullable 值类型返回 null
。例如
double? variable = default(double?); //sets variable to null
reference here
出于这个原因,我们应该使用 GetValueOrDefault()
。
值得一提的是,如果可空值实际上设置为空值,则显式将可空值类型转换为不可空值类型会引发空异常。
来自同一个链接
int? n = null;
//int m1 = n; // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null
所以建议的方法应该是 valueAddedTax.TaxableGoodsSalePrice.GetValueOrDefault(0)
reference here