2012-10-15 12 views
6

を引き起こししょっちゅうRentlerで、我々はにSystem.FormatExceptionエラーお客様は、FormatException

を参照して、文字列は、私たちの健康監視に有効なブール

として認識されませんでした。明らかになったように、他の場所でコピー/貼り付けするときに、顧客が時折URLの末尾を切り捨てるように見えます。ブール型パラメータが文字列の最後にある傾向があり、顧客がソーシャルネットワーク上で共有すると、エラーレポートが出力されます。

ます。https:// {ドメイン} /検索SID = 17403777 & NID = 651 &場所= 840065 & propertytypecode = 1 & photosonly = FALS

我々はすべてのために結合モデルを使用し、だから私は本当にこれに対処する方法がわからない。私は文字列にプロパティを変更し、コントローラのアクションでそれを解析しようとすることができますが、それはちょっとです。モデルバインダーをTryParse()にバインドする単純で流暢な方法はありますか?そうでない場合はfalseに解決しますか?

+0

これは知ってうれしいことです。答えがあなたのモデルのバインダーを書くことを望んでいないことを願っています。 – Gromer

+0

それが私が望んでいることです、グロマー。このような有機的な、まれなエラーですが、非常に迷惑です。 – Dusda

+1

boolの代わりに文字列パラメータとして 'photosonly'を持つオーバーロードを作成すると、普通のものをfalseで呼び出した結果を返します。 – Bobson

答えて

1

ブール型データ型のカスタムモデルバインダーはどうですか?

/// <summary> 
/// A custom model binder for boolean values. This behaves the same as the default 
/// one, except it will resolve the value to false if it cannot be parsed. 
/// </summary> 
public class BooleanModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     //MVC checkboxes need specific handling in checked state 
     if (string.Equals(valueResult.AttemptedValue, "true,false")) 
     { 
      AddToModelState(bindingContext, valueResult); 
      return true; 
     } 

     bool parsed = false; 
     if (Boolean.TryParse(valueResult.AttemptedValue, out parsed)) 
     { 
      AddToModelState(bindingContext, valueResult); 
      return parsed; 
     } 

     return false; 
    } 

    private static void AddToModelState(ModelBindingContext bindingContext, ValueProviderResult valueResult) 
    { 
     bindingContext.ModelState.Add(bindingContext.ModelName, new ModelState { Value = valueResult }); 
    } 
} 

//in Global.asax 
protected void Application_Start() 
{ 
    ... 
    ModelBinders.Binders.Add(typeof(bool), new BooleanModelBinder()); 
} 
+0

ニース!だから、私はこのバインダーは 'bool'プロパティを持つ複合型でも使用されると仮定していますか?クラスカー{public bool IsAwesome {get;セット; }パブリック文字列名{get;セット; }} 'アクションメソッドの' car'引数にバインドするためにデフォルトのバインダを使用し、リクエストに入ってくる 'IsAwesome'データが見つかると' BooleanModelBinder'を使用しますか? – Gromer

+1

はい、IsAwesomeプロパティはこのModelBinderにバインドされます。ブール値のプロパティはこの特定のバインダーを使用し、残りのモデルバインドは通常の方法で行われます。 – pkmiec

+0

ありがとう、Dooh。私はカスタムバインダーを実装しなければならないと思ったが、MVCにどこか暗いコーナーがあってデフォルトのものを設定できると思った。ああ、これが最良のアプローチです。 – Dusda

0

いつもtry/catchブロックを追加して、キャッチにデフォルト値を設定することができます。

代わりに、パラメータの最初の文字が 'T'または 'F'であるかどうかだけを確認することもできます。これは多くの問題を回避するはずです。

+0

TryParse()よりも優れているでしょうが、Rentlerは他社との複数の統合を持っているため、コントローラのアクションでそのようなカスタム検証を実装することを避けたいと思います。 。 – Dusda

+0

これは非常に特殊な問題ですが、特定の解決策が必要なようです。 TryParseをTry/Catchするメリットはありませんので、私の選択肢を守ることはできません。 – SamuelDavis

関連する問題