2011-10-20 8 views
5

मैं एमवीसी 3 में Web.Config मानों के साथ रेंज मानों को कैसे बदल सकता हूं?डेटा एनोटेशन - मैं वेब के साथ रेंज वैल्यू को कैसे बदल सकता हूं। एमवीसी 3 में कॉनफिग मान?

[Range(5, 20, ErrorMessage = "Initial Deposit should be between $5.00 and $20.00") 
public decimal InitialDeposit { get; set; } 

web.config:

<add key="MinBalance" value="5.00"/> 
<add key="MaxDeposit" value="20.00"/> 
+1

[डेटा एनोटेशन/सत्यापन और गतिशील मानों] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2122161/data-annotation-valalidation-and- गतिशील-values) –

उत्तर

7

आप RangeAttribute से इनहेरिट और IClientValidatable को लागू कस्टम विशेषता बनाने की आवश्यकता होगी।

public class ConfigRangeAttribute : RangeAttribute, IClientValidatable 
    { 
     public ConfigRangeAttribute(int Int) : 
      base 
      (Convert.ToInt32(WebConfigurationManager.AppSettings["IntMin"]), 
      Convert.ToInt32(WebConfigurationManager.AppSettings["IntMax"])) { } 

     public ConfigRangeAttribute(double Double) : 
      base 
      (Convert.ToDouble(WebConfigurationManager.AppSettings["DoubleMin"]), 
      Convert.ToDouble(WebConfigurationManager.AppSettings["DoubleMax"])) 
     { 
      _double = true; 
     } 

     private bool _double = false; 

     public override string FormatErrorMessage(string name) 
     { 
      return String.Format(ErrorMessageString, name, this.Minimum, this.Maximum); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      var rule = new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(this.ErrorMessage), 
       ValidationType = "range", 
      }; 
      rule.ValidationParameters.Add("min", this.Minimum); 
      rule.ValidationParameters.Add("max", this.Maximum); 
      yield return rule; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (value == null) 
       return null; 

      if (String.IsNullOrEmpty(value.ToString())) 
       return null; 

      if (_double) 
      { 
       var val = Convert.ToDouble(value); 
       if (val >= Convert.ToDouble(this.Minimum) && val <= Convert.ToDouble(this.Maximum)) 
        return null; 
      } 
      else 
      { 
       var val = Convert.ToInt32(value); 
       if (val >= Convert.ToInt32(this.Minimum) && val <= Convert.ToInt32(this.Maximum)) 
        return null; 
      } 

      return new ValidationResult(
       FormatErrorMessage(this.ErrorMessage) 
      ); 
     } 
    } 

उदाहरण उपयोग:

[ConfigRange(1)] 
public int MyInt { get; set; } 

[ConfigRange(1.1, ErrorMessage = "This one has gotta be between {1} and {2}!")] 
public double MyDouble { get; set; } 

पहला उदाहरण डिफ़ॉल्ट त्रुटि संदेश वापस आ जाएगी, और दूसरी अपने कस्टम त्रुटि संदेश वापस आ जाएगी। दोनों web.config में परिभाषित श्रेणी मानों का उपयोग करेंगे।

+0

बिल्कुल सही! इसने काम कर दिया। आपको बहुत - बहुत धन्यवाद! – rk1962

+0

आप प्रतिभाशाली हैं! – rk1962

+0

सराहना करना बहुत अच्छा है। ; ^> धन्यवाद, और शुभकामनाएं। – counsellorben

4

आप ऐसा करने के लिए है कि संपत्ति पर विशेषता घोषणा में सक्षम के रूप में मान संकलन समय पर जाना जाने की जरूरत नहीं होगी। ऐसा करने का सबसे आसान तरीका यह है कि मैं RangeAttribute से एक विशेषता वर्ग प्राप्त करना होगा और संपत्ति मूल्यों को व्युत्पन्न कक्षा में web.config से आना होगा।

public class RangeFromConfigurationAttribute : RangeAttribute 
{ 
    public RangeFromConfigurationAttribute() 
     : base(int.Parse(WebConfigurationManager.AppSettings["MinBalance"]), int.Parse(WebConfigurationManager.AppSettings["MaxDeposit"])) 
    { 

    } 
} 

की तरह कुछ है, हालांकि एक बेहतर नाम के साथ आने के लिए चाहते हो सकता है :)

+0

आपको बहुत बहुत धन्यवाद। मैंने अभी उपरोक्त कोड के साथ एक कक्षा बनाई है और यह काम नहीं किया है। क्या मैं कुछ भूल रहा हूँ? – rk1962

+0

मैं देखूंगा कि क्या मैं एक उदाहरण जोड़ सकता हूं, हालांकि काउंसेलोरबेन का कोड ऐसा लगता है जैसे यह काम करेगा - http://stackoverflow.com/users/624472/counsellorben –

+0

@Russ कैम, खुश किसी ने मेरा योगदान देखा। हालांकि आपको अभी भी उपहार मिल गया है। ;) – counsellorben

1

यहां जोर से सोचकर, लेकिन ConfigRange विशेषता यह बताती है कि कॉन्फ़िगर करने के लिए कॉन्फ़िगर होना आवश्यक है। क्या आप एक स्थिर वर्ग नहीं लिख सकते हैं जो web.config, app.config या जो भी आप फिट देखते हैं, से अपने मान पढ़ेंगे, और फिर मौजूदा श्रेणी विशेषता में उस स्थिर वर्ग का उपयोग करें?

public static class RangeReader 
{ 
    public static double Range1 
    { 
     // Replace this with logic to read from config file 
     get { return 20.0d; } 
    }   
} 

फिर साथ अपनी संपत्ति पर टिप्पणी:

[Range(ConfigReader.Range1, 25.0d)] 

मुझे पता है कि स्थिर कक्षाओं बुरा कर रहे हैं और वहाँ अच्छी तरह से यह नहीं करने के लिए एक अच्छा कारण हो सकता है, लेकिन मैंने सोचा था कि मैं एक जाना दे देंगे।

+1

मुझे लगता है कि मैंने पहले यह कोशिश की और यह काम नहीं किया। – rk1962

+0

मेरे पास व्यू मॉडल के साथ कोई संकलन त्रुटियां नहीं थीं, लेकिन दृश्य में दृश्य मॉडल को पास करके इसका परीक्षण करने का कोई मौका नहीं था। क्या आपको याद है कि यह क्यों काम नहीं करता? –

+0

मैं फिर कोशिश करूंगा और आपको त्रुटि संदेश बता दूंगा। धन्यवाद! – rk1962

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