2012-10-15 11 views
6

हर इतनी बार Rentler पर हम त्रुटिग्राहकों क्वेरी स्ट्रिंग छोटा किया जा रहा, का कारण बनता है FormatException

System.FormatException देखते हैं, स्ट्रिंग एक मान्य बूलियन

हमारे स्वास्थ्य की निगरानी के रूप में पहचाना गया था। जैसे-जैसे यह निकलता है, ऐसा लगता है कि हमारे ग्राहक कभी-कभी यूआरएल के अंत को छीनते हैं जब इसे कहीं और कॉपी/चिपकाते हैं। ऐसा ही होता है कि एक बुलियन पैरामीटर स्ट्रिंग के अंत में होता है, और जब कोई ग्राहक इसे कुछ सोशल नेटवर्क पर साझा करता है तो हमें त्रुटि रिपोर्टों के साथ डंप किया जाता है।

https: // {domain}/खोज sid = 17,403,777 & एनआईडी = 651 & स्थान = 840,065 & propertytypecode = 1 & photosonly = fals

हम सब कुछ के लिए बाध्यकारी मॉडल का उपयोग, तो मुझे सच में यकीन नहीं है कि इससे कैसे निपटें। मैं संपत्ति को एक स्ट्रिंग में बदल सकता हूं और नियंत्रक कार्रवाई में इसे पार्स करने का प्रयास कर सकता हूं, लेकिन यह मैला है। क्या Tryparse() में मॉडल बाइंडर प्राप्त करने के लिए कोई आसान, धाराप्रवाह तरीका है और अगर यह नहीं कर सकता तो झूठ का हल हो सकता है?

+0

यह जानना अच्छा लगेगा। आशा है कि उत्तर में आपके स्वयं के मॉडल बाइंडर को लिखना शामिल नहीं है। – Gromer

+0

यही वह है जो मैं उम्मीद कर रहा हूं, ग्रोमर। यह ऐसी कार्बनिक, कम त्रुटि है, लेकिन अत्यधिक परेशान है। – Dusda

+1

एक अधिभार बनाने के बारे में क्या है जिसमें 'फोटोनली' को एक बूल के बजाय स्ट्रिंग पैरामीटर के रूप में रखा गया है, जो सामान्य को एक झूठी के साथ कॉल करने का परिणाम देता है? – 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

अच्छा! तो, मुझे लगता है कि यह बांधने वाला एक जटिल प्रकार में भी इस्तेमाल किया जाएगा जिसमें 'बूल' संपत्ति है? मान लें कि आपके पास 'क्लास कार {सार्वजनिक बूल IsAwesome {get; सेट; } सार्वजनिक स्ट्रिंग नाम {प्राप्त करें; सेट; }} 'यह मेरी क्रिया विधि में' कार 'तर्क से जुड़ने के लिए डिफ़ॉल्ट बाइंडर का उपयोग करेगा, और' BooleanModelBinder' का उपयोग करेगा जब यह अनुरोध में आने वाले 'IsAwesome' डेटा का सामना करता है? – Gromer

+1

हां, IsAwesome संपत्ति इस मॉडलबिंडर से बंधी जाएगी। बूलियन गुण इस विशेष बांधने की मशीन का उपयोग करेंगे, और शेष मॉडल बाध्यकारी सामान्य तरीके से चलेंगे। – pkmiec

+0

धन्यवाद, दोह। मुझे लगा कि मुझे एक कस्टम बाइंडर लागू करना होगा, लेकिन आशा है कि एमवीसी के पास कहीं कुछ अंधेरा कोने था जो मुझे डिफ़ॉल्ट को कॉन्फ़िगर करने देगा। ओह ठीक है, यह सबसे अच्छा तरीका है। – Dusda

0

आप हमेशा कोशिश/पकड़ ब्लॉक जोड़ सकते हैं और पकड़ में डिफ़ॉल्ट मान रख सकते हैं।

एक विकल्प केवल यह जांचना होगा कि पैरामीटर का पहला अक्षर 'टी' या 'एफ' है या नहीं। इससे कई मुद्दों से बचना चाहिए।

+0

यह TryParse() से बेहतर होगा, लेकिन मैं कंट्रोलर एक्शन में कस्टम सत्यापन को लागू करने से बचाना पसंद करूंगा, खासकर जब से रेंटलर के पास अन्य कंपनियों के साथ कई एकीकृतताएं हैं, और इस प्रकार कई नियंत्रक कार्रवाइयां जिन्हें मैं कवर करना चाहता हूं । – Dusda

+0

ऐसा लगता है कि यह एक बहुत ही विशिष्ट समस्या है, हालांकि एक विशिष्ट समाधान की आवश्यकता है। मुझे कोशिश करने/पकड़ने के लिए TryParse का कोई भी लाभ नहीं दिखता है, इसलिए इस पर मेरी पसंद का बचाव नहीं कर सकता। – SamuelDavis

संबंधित मुद्दे