2012-09-05 190 views
1

我在我的asp.net MVC網站上使用datamodel驗證,我遇到了一個錯誤。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」。

+0

「 5,5「絕對是一個很好的迴應,因爲它不是一個數字。我正在調查你是否遇到類型爲double的問題? –

+0

你會得到與其他非整數相同的結果嗎? (例如2.25)。問題可能是驗證期望int而不是double。 – Ammar

+0

@JohnSykor實際上5,5不是很錯誤,因爲FR語言環境是官方分隔符。 – J4N

回答

3

事實上,問題是客戶端驗證似乎與EN文化和服務器一起使用FR-FR驗證。

所以我寫了一個簡單的模型綁定器是文化不變:

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

要模仿你的錯誤我的模型看起來像

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

請檢查你的代碼,也許做了編輯,因爲當int值更改爲兩個,5.5將正常工作,除非您的控制器或模型有一些其他代碼在它導致此驗證。

+0

就像我說的,我的模型有一個雙重的,我沒有別的事情比在我的控制器中的if(ModelState.IsValid){//堅持更改}。我的模型中也沒有特殊的數據註釋 – J4N