1

asp.net MVC Web サイトでデータモデル検証を使用していますが、エラーが発生しました。

私のモデルは次のようになります。

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

ほとんどの場合は問題なく動作しますが、「値」フィールドに「5.5」などの 10 進数値があると、検証エラーが発生します。

Web サイトは "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 に答える