2016-02-19 12 views
7

मुझे FluentValidation के साथ कोई समस्या है जहां मैं किसी दिए गए श्रृंखला में सत्यापन त्रुटि के बावजूद एक संदेश प्रदर्शित करना चाहता हूं। उदाहरण के लिए, मैंने नीचे एक संपत्ति के लिए एक सत्यापन श्रृंखला परिभाषित की है। मैं उम्मीद करता हूं कि श्रृंखला का मूल्यांकन किया जाएगा और किसी भी विफलता के परिणामस्वरूप संदेश WithMessage() कॉल में परिभाषित किया जाएगा। हालांकि, ऐसा लगता है कि यह शॉर्ट सर्किटिंग है और केवल पहली त्रुटि के लिए FluentValidation डिफ़ॉल्ट त्रुटि संदेश प्रदर्शित कर रहा है। देखें नीचे दिए गए कोड:नियम श्रृंखला के लिए एक संदेश?

RuleFor(s => s.ProposalDetail.AgeMin).NotNull() 
     .GreaterThanOrEqualTo(1) 
     .LessThanOrEqualTo(99) 
     .WithMessage("Minimum Age entry is required and must range from 1 to 99 years."); 

बात ये है कि AgeMin संपत्ति शून्य है, इसलिए पहले NotNull() जांच विफल हो रहा है और सत्यापन सन्देश में लिखा है " 'प्रस्ताव विस्तार उम्र मिन।' खाली नहीं होना चाहिए।" प्रस्ताव विवरण encapsulating दृश्य मॉडल का नाम है। मैंने पूरे सत्यापनकर्ता के लिए कैस्केडमोड को कैस्केडमोड पर सेट करने का प्रयास किया है। जारी रखें, लेकिन इसका कोई प्रभाव नहीं है।

मैं एक संपत्ति सत्यापन श्रृंखला के लिए एक संदेश कैसे पूरा कर सकता हूं?

+0

'उपर्युक्त कोड के साथ, डिफ़ॉल्ट सत्यापन संदेश को वापस करने के बजाए वापस किया जाता है अंत में टॉम संदेश 'डिफ़ॉल्ट संदेश कहां घोषित किया गया है ..? क्या आप सभी प्रासंगिक कोड पोस्ट कर सकते हैं .. आपने भी जांच की है [.NET दस्तावेज़ीकरण/एक्सामल्स] के लिए fluentvalidation (https://fluentvalidation.codeplex.com/wikipage?title=CreatingAValidator) – MethodMan

+0

हां, मैंने प्रलेखन और हेवन ' टी एक समान उदाहरण मिला। मुझे लगता है कि मुझे जो करना है, उसे पूरा करने के लिए सभी नियमों को समाहित करने के लिए मुझे 'अनिवार्य() 'का उपयोग करके एक नियम का उपयोग करना होगा। मैंने सोचा होगा कि यह एक साधारण उपयोग मामला है। डिफ़ॉल्ट FluentValidation संदेश ''प्रस्ताव विवरण देता है। आयु न्यूनतम 'खाली नहीं होना चाहिए' क्योंकि 'NotNull() 'श्रृंखला में पहला कॉल है। मैंने वैधकर्ता के लिए 'कैस्केडमोड = कैस्केडमोड.कॉन्टीन्यू' सेट करने का प्रयास किया है, जिसका कोई प्रभाव नहीं पड़ा। – TimeBomb006

+0

कृपया एक [एमसीवी] प्रदान करें जो आपकी समस्या का प्रदर्शन करता है। यह संकलित कोड होना चाहिए जिसे हम चला सकते हैं। – Enigmativity

उत्तर

7

अद्यतन 2

यह पता चला है के रूप में, आप पूरा कर सकते हैं एक सरल विस्तार विधि

using FluentValidation; 
using FluentValidation.Internal; 
using FluentValidation.Resources; 
using FluentValidation.Results; 
using System; 
using System.Linq; 

namespace ConsoleApplication9 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Customer customer = new Customer() { }; 
      CustomerValidator validator = new CustomerValidator(); 
      ValidationResult results = validator.Validate(customer); 
      Console.WriteLine(results.Errors.First().ErrorMessage); 
      Console.ReadLine(); 
     } 
    } 
    public class CustomerValidator : AbstractValidator<Customer> 
    { 
     public CustomerValidator() 
     { 

      RuleFor(s => s.Id).NotNull() 
          .GreaterThanOrEqualTo(1) 
          .LessThanOrEqualTo(99) 
          .WithGlobalMessage("Minimum Age entry is required and must range from 1 to 99 years."); 
     } 

    } 

    public class Customer { public int? Id { get; set; } } 

    public static class MyExtentions 
    { 
     public static IRuleBuilderOptions<T, TProperty> WithGlobalMessage<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, string errorMessage) 
     { 
      foreach (var item in (rule as RuleBuilder<T, TProperty>).Rule.Validators) 
       item.ErrorMessageSource=new StaticStringSource(errorMessage); 

      return rule; 
     } 
    } 
} 
+1

आपका अपडेट 2 सही उत्तर है। मैं एक समान समाधान में देखने जा रहा था, लेकिन आप मुझे इसे हराया। – devuxer

+0

@devuxer मैंने शैक्षिक उद्देश्यों के लिए केवल पिछले लोगों को छोड़ दिया –

+1

@ जॉर्जवोवोस यह इस समस्या का एक उत्कृष्ट, सुरुचिपूर्ण समाधान है। मैंने पुष्टि की है कि समाधान अपेक्षित प्रदर्शन कर रहा है। धन्यवाद! – TimeBomb006

3

सबसे सरल समाधान सिर्फ एक चर के लिए संदेश स्थापित करने के लिए किया जाएगा के साथ आप क्या चाहते हैं, और प्रत्येक नियम के बाद एक ही संदेश लागू करें:

var message = "Minimum Age entry is required and must range from 1 to 99 years."; 
RuleFor(s => s.ProposalDetail.AgeMin) 
    .NotNull() 
     .WithMessage(message) 
    .GreaterThanOrEqualTo(1) 
     .WithMessage(message) 
    .LessThanOrEqualTo(99) 
     .WithMessage(message); 
+1

मैं वास्तव में इस समाधान का उपयोग कर रहा था जब तक कि मैंने जॉर्ज के संपादन को देखा। दोनों दृष्टिकोण व्यवहार्य हैं, लेकिन मुझे जॉर्ज के समाधान की सफाई पसंद है। – TimeBomb006

+0

इस दृष्टिकोण का उपयोग तब किया जा सकता है जब आपको विभिन्न सत्यापन नियमों के लिए अलग-अलग संदेशों को असाइन करने की आवश्यकता हो। – user1176058

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