asp.net MVC数据模型验证为double

时间:2012-09-05 14:16:33

标签: c# asp.net-mvc asp.net-mvc-3 validation

我正在asp.net MVC网站上使用datamodel验证,但我遇到了错误。

我的模型看起来像这样:

public class MyModel{
  public String Name{get;set;}
  public double? Value {get;set;}
}

在大多数情况下它工作正常,但如果我在“值”字段中有一个十进制值,比如“5.5”,我收到了验证错误。

该网站在“Fr-FR”区域设置下运行。我试过“5.5”或“5,5”,它们都不起作用,但我得到了不同的信息:

La valeur '5.5' n'est pas valide pour Value.

应该是"The value '5.5' isn't valide for Value"

并且

Le champ Value doit être un nombre.

这意味着"The field Value has to be a number"

我在我的代码背后的唯一逻辑是我在进行更新之前使用“ModelState.IsValid”。

为什么这不起作用,我该怎么做才能解决这个问题?

重要编辑 通过调试,我看到我的模型的字段在带有小数的数字时变为“NULL”。

2 个答案:

答案 0 :(得分:3)

实际上问题是客户端验证似乎适用于EN文化和带有fr-FR验证的服务器。

所以我写了一个简单的modelBinder,它是文化不变的:

public class NullableDoubleModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        if (valueResult.AttemptedValue != null)
        {
            try
            {
                actualValue = Convert.ToDouble(valueResult.AttemptedValue, CultureInfo.InvariantCulture);
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }
        }



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

我在Global.asax文件中注册它:

protected void Application_Start()
{
   //Other stuff
   ModelBinders.Binders.Add(typeof(double?), new NullableDoubleModelBinder());
}

现在它有效:)

答案 1 :(得分:1)

模仿您的错误,我的模型看起来像

public class MyModel{
  public String Name{ get; set; }
  public int? Value { get; set; }
}

请检查您的代码并进行编辑,因为当int更改为double 时,5.5将正常工作,除非您的控制器或模型中包含导致此验证的其他代码。