.NET MVC 3自定义十进制?模型粘合剂

时间:2011-05-24 14:25:35

标签: asp.net-mvc-3

在我的模型中,我有以下小数?属性:

public decimal? Budget { get; set; }

我意识到我需要一个小数的自定义模型绑定器,Haack在以下链接中提供:http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

我修改了他的代码,这样如果传入的值确实包含货币符号和/或逗号,那么我将其剥离然后尝试将其转换为小数。这是有效的,但我的属性是一个可以为空的十进制类型,我也希望它不接受任何东西并沿着它的快乐方式移动到我的数据库中的该列插入一个null。现在它插入0.00。我知道我在代码中遗漏了一些东西,但是脑子里却冻结了。

这是活页夹代码:

 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    object newValue = null;
    try
    {
        if (!string.IsNullOrEmpty(valueResult.AttemptedValue))
        {
            newValue = valueResult.AttemptedValue.Replace("$", "").Replace(",", "");
        }

        actualValue = Convert.ToDecimal(newValue, CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
        modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
}

再次,目标是有小数?像往常一样行事,但如果有一个包含货币符号和/或逗号的值,它可以转换为小数,然后返回。

由于

2 个答案:

答案 0 :(得分:8)

您可能最好利用内置支持来处理NumberStyles。通过这样做,你可以解释不仅仅是普通的美元符号,但也可以处理英镑,日元等......

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult valueResult = bindingContext.ValueProvider
        .GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    try
    {
        if(!string.IsNullOrWhiteSpace(valueResult.AttemptedValue))
            actualValue = Decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
        modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
}

答案 1 :(得分:1)

在try块中,我认为你需要像

这样的东西
string valToCheck = valueResult.AttemptedValue;
if(valToCheck == string.Empty)
{
    actualValue = null;
}
else
{
    actualValue = Convert.ToDecimal(valToCheck.Replace("$", string.Empty), CultureInfo.InvariantCulture);
 }

在您的代码中,您始终将actualValue设置为ToDecimal()的结果。