1

我在我的 asp.net MVC 网站上使用数据模型验证,但遇到了错误。

我的模型如下所示:

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”。

4

2 回答 2

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());
}

现在它可以工作了:)

于 2012-09-06T07:17:57.930 回答
1

为了模仿你的错误,我的模型看起来像

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

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

于 2012-09-05T14:53:38.823 回答