2012-10-15 26 views
6

幾乎每隔一段時間在Rentler我們看到的錯誤客戶截斷查詢字符串,導致出現FormatException

System.FormatException,字符串未被識別爲我們的健康監測有效的布爾

。事實證明,它看起來像我們的客戶偶爾在其他地方複製/粘貼時會截斷url的末尾。恰巧,布爾參數傾向於在字符串的末尾,當客戶通過某個社交網絡分享它時,我們會拋出錯誤報告。

的https:// {域} /搜索SID = 17403777 & NID = 651 &位置= 840065 & propertytypecode = 1 & photosonly = FALS

我們用模型的一切結合,所以我不確定如何處理這個問題。我可以將該屬性更改爲字符串,並嘗試在控制器操作中解析它,但這很sl。。有沒有簡單,流暢的方式來獲取模型綁定到TryParse()它,只是如果它不能解析爲false?

+0

這將很高興知道。希望答案不涉及編寫你自己的模型綁定。 – Gromer

+0

這就是我所希望的,格羅默。這是一個有機的,不經常發生的錯誤,但非常煩人。 – Dusda

+1

如何創建一個具有'photosonly'作爲字符串參數而不是bool的超載,它只是返回一個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」屬性的複雜類型中也會使用?假設你有'class car {public bool IsAwesome {get;組; } public string Name {get;組; }}'它會使用默認的綁定綁定到我的action方法中的'car'參數,並在遇到請求中傳入的'IsAwesome'數據時使用'BooleanModelBinder'? – Gromer

+1

是的,IsAwesome屬性將綁定到這個ModelBinder。布爾屬性將使用這個特定的聯編程序,並且模型聯編的其餘部分將以通常的方式進行。 – pkmiec

+0

謝謝,Dooh。我想我必須實現一個自定義綁定,但希望MVC有一個黑暗的角落,讓我配置默認的一個地方。哦,這是最好的方法。 – Dusda

0

你總是可以添加一個try/catch塊並在catch中有一個默認值。

另一種方法是隻檢查參數的第一個字母是'T'還是'F'。這應該避免很多問題。

+0

TryParse()比這更好,但我更願意避免在控制器動作中實現自定義驗證,特別是因爲Rentler與其他公司有多個集成,因此我必須覆蓋多個控制器操作。 – Dusda

+0

聽起來像這是一個非常具體的問題,但需要一個特定的解決方案。我也沒有看到TryParse Try/Catch的任何好處,因此無法爲此選擇辯護。 – SamuelDavis