7

मैं निम्नलिखित मॉडल वर्ग मिल गया है (सादगी के लिए छीन लिया):ASP.NET MVC डिफ़ॉल्ट बांधने की मशीन: बहुत लंबा ints, खाली मान्यता त्रुटि संदेश

public class Info 
{ 
    public int IntData { get; set; } 
} 

यहाँ मेरी उस्तरा रूप है कि इस मॉडल का उपयोग करता है:

"मान 'qqqqq' नहीं क्षेत्र 'IntData' के लिए मान्य है":
@model Info 
@Html.ValidationSummary() 
@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(x => x.IntData) 
    <input type="submit" /> 
} 

अब अगर मैं टेक्स्ट बॉक्स में एक गैर संख्यात्मक डेटा दर्ज करते हैं, मैं एक सही सत्यापन संदेश अर्थात प्राप्त करते हैं।

लेकिन यदि मैं अंकों का एक बहुत लंबा अनुक्रम दर्ज करता हूं (जैसे 345234775637544), तो मुझे एक ईएमपीटीई सत्यापन सारांश प्राप्त होता है।

मेरी नियंत्रक कोड में, मुझे लगता है कि ModelState.IsValidfalse है अपेक्षा के अनुरूप है, और ModelState["IntData"].Errors[0] इस प्रकार है:

{System.Web.Mvc.ModelError} 
ErrorMessage: "" 
Exception: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."} 

(exception itself) [System.InvalidOperationException]: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."} 
InnerException: {"345234775637544 is not a valid value for Int32."} 

आप देख सकते हैं, मान्यता सामान्य रूप से काम करता है, लेकिन करने के लिए एक त्रुटि संदेश उपज नहीं है उपभोक्ता।

क्या मैं डिफ़ॉल्ट मॉडल बाइंडर के व्यवहार को ट्विक कर सकता हूं ताकि यह इस मामले में उचित त्रुटि संदेश दिखा सके? या मुझे कस्टम बाइंडर लिखना होगा?

उत्तर

8

एक तरह से कस्टम मॉडल बांधने की मशीन लिखने के लिए होगा:

public class IntModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (value != null) 
     { 
      int temp; 
      if (!int.TryParse(value.AttemptedValue, out temp)) 
      { 
       bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format("The value '{0}' is not valid for {1}.", value.AttemptedValue, bindingContext.ModelName)); 
       bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value); 
      } 
      return temp; 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

जो Application_Start में पंजीकृत किया जा सकता है:

ModelBinders.Binders.Add(typeof(int), new IntModelBinder()); 
+0

धन्यवाद, अगर मैं डिफ़ॉल्ट बाइंडर को ट्विक करने में सक्षम नहीं हूं तो मैं इस समाधान का चयन करूंगा। – Zruty

+0

मैं सुझाव देता हूं कि 'bindingContext.ModelName' को' bindingContext.ModelMetadata.DisplayName' 'में बदलना है, यदि आप विशेषता पर स्थानीयकृत फ़ील्डनाम चाहते हैं' [प्रदर्शन (नाम = ...)] '। – Gh61

1

कैसे 10 या तो करने के लिए इनपुट क्षेत्र पर MaxLength स्थापना के बारे में? मैं इंटडाटा पर एक सीमा निर्धारित करने के साथ संयोजन में ऐसा करूंगा। बेशक आप एक उपयोगकर्ता को 345234775637544 दर्ज करने की अनुमति नहीं देना चाहते हैं। उस स्थिति में आप एक स्ट्रिंग के साथ बेहतर हो।

+0

अब ऐसा कुछ है जिसे मैंने नहीं सोचा था :) धन्यवाद। – Zruty

+0

स्मार्ट है :)! – frictionlesspulley

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