5

रोकना हम जटिल प्रकार के प्रयोग कर रहे हैं इस तरह हमारे अनुवाद क्षेत्रों का प्रबंधन करने के:इकाई की रूपरेखा जटिल प्रकार कस्टम मान्यता, मान्यता Recursion

[ComplexType] 
public class Translated 
{ 
    [Required] 
    public string NL { get; set; } 

    [Required] 
    public string EN { get; set; } 

    [ScaffoldColumn(false)] 
    public string TranslatedText 
    { 
     get 
     { 
      return Util.Translate(NL, EN); 
     } 
    } 
} 

हम उपस्थित होना क्षेत्रों की आवश्यकता है। लेकिन कुछ मामलों में पूरी अनुवादित क्षेत्र में के रूप में वैकल्पिक है:

public class Question 
{ 
    ... 

    [Optional(ErrorMessage="Foo")] 
    public Translated Description { get; set; } 

    ... 
} 

हालांकि, ऐसा लगता है कि वैकल्पिक विशेषता गणना की जाती है, और झूठे कुछ भी नहीं जब यह रिटर्न परिणाम के साथ किया जाता है।

class OptionalAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     return false; 
    } 
} 

जब मैं एक गैर जटिल प्रकार यह उम्मीद के रूप में काम करता है पर वैकल्पिक विशेषता शब्दों में कहें, त्रुटि संदेश हमेशा फू हो जाएगा।

अंतिम लक्ष्य दोनों मामलों में विवरण खाली होने की अनुमति देना है, लेकिन जब फ़ील्ड भरने में से एक त्रुटियों को प्रसारित करना चाहिए।

रोक सत्यापन प्रत्यावर्तन क्षेत्र वैकल्पिक होने के लिए कारण होगा, लेकिन यह भी मामले में खेतों वे में भर रहे हैं के सत्यापन रोका जा सके।

यह कैसे पूरा करने के लिए पर कोई भी विचार?

+0

बीटीडब्ल्यू। ईएफ सीटीपी 5 पुराना संस्करण है। वर्तमान verwion ईएफ 4.1 आरटीडब्ल्यू (अंतिम संस्करण) कहा जाता है। –

+0

मैं इस स्थिति का परीक्षण नए संस्करण के साथ करूँगा और रिपोर्ट करूंगा। –

+0

जिस स्थिति में मैंने अपने मूल प्रश्न में स्केच किया है वह अभी भी है। मुझे लगता है कि मैं अपनी संस्थाओं की वैध विधि को ओवरराइड कर सकता हूं ताकि यह जांच सके कि यह वैकल्पिक है या नहीं, और यदि मामला केवल तभी खाली होता है जब यह खाली नहीं होता है। इस पर कोई सुझाव है कि इसे कैसे कार्यान्वित किया जाए? मैं अपने आप के साथ एमवीसी/फ्रेमवर्क आपूर्ति कोड ओवरराइट करने से भी डरता हूं। –

उत्तर

7

आपकी स्ट्रिंग गुणों पर डेटा एनोटेशन [Required] का उपयोग डेटाबेस में गैर शून्य फ़ील्ड बनाएगा। आपके विवरण से ऐसा लगता है कि कभी-कभी आप चाहते हैं कि वे दोनों मान शून्य हो जाएं।

मैं आपके स्वयं के सत्यापन को कार्यान्वित करने का सुझाव दूंगा जो परिभाषित करता है कि उन क्षेत्रों को वैकल्पिक बनाता है।

[ComplexType] 
public class Translated : IValidatableObject 
{ 
    public string NL { get; set; } 

    public string EN { get; set; } 

    [NotMapped] 
    public string TranslatedText 
    { 
     get 
     { 
      return Util.Translate(NL, EN); 
     } 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!string.IsNullOrEmpty(NL) && string.IsNullOrEmpty(EN)) 
      yield return new ValidationResult("EN is required if NL is entered."); 

     if (!string.IsNullOrEmpty(EN) && string.IsNullOrEmpty(NL)) 
      yield return new ValidationResult("NL is required if EN is entered."); 
    } 
} 
+0

यहां बिंदु यह है कि क्या फ़ील्ड आवश्यक है संदर्भ पर निर्भर है जहां इस जटिल प्रकार का उपयोग किया जाता है। मैं निश्चित रूप से 'अनुवादित', 'TranslatedOptional' जैसे कई जटिल प्रकार बना सकता हूं। लेकिन यह मेरे लिए अजीब लगता है, और मुझे नहीं पता कि यह बिल्कुल काम करेगा या नहीं। –

+0

@Alessandro: अपफ्रंट, मुझे ADO.NET के बारे में कुछ नहीं पता ... लेकिन यह कस्टम मान्य तरीका ऐसा लगता है कि यह मेरे लिए "बहुत गर्म" हो रहा है। एकमात्र समस्या यह है कि अनुवादित होना चाहिए (वैकल्पिक या अनिवार्य), हां? वैसे यह मेरे लिए अनुवादित की विशेषता की तरह बहुत कुछ लगता है ... सार्वजनिक बूल अनिवार्य {प्राप्त करें; सेट; } ... या मैं बस गूंगा मधुमक्खी कर रहा हूँ? और यदि हां, तो क्यों? – corlettk

+0

चाहे यह वैकल्पिक है या नहीं, वास्तव में अनुवादित की विशेषता है, लेकिन यह उस संदर्भ द्वारा निर्धारित रूप से निर्धारित किया जाता है जहां अनुवादित फ़ील्ड का उपयोग किया जाता है। तो यह एक संपत्ति है लेकिन एक विशेषता नहीं है। –

0

यही वह है जो मैं अब कर रहा हूं। इसका नुकसान यह है कि प्रत्येक प्रकार के अनुवादित (अनुवादित, अनुवादित वैकल्पिक, अनुवादित मल्टीलाइन और अनुवादित मल्टीलाइनऑप्शनल) के लिए आपके पास अलग-अलग वर्ग हैं।

एक और नुकसान यह है कि मुझे नहीं पता कि एनएल एन एन फ़ील्ड में सत्यापन के बजाय सत्यापन परिणामों को कैसे जोड़ना है।

[ComplexType] 
public class TranslatedMultiline : IValidatableObject 
{ 
    [DataType(DataType.MultilineText)] 
    [Display(Name = "dutch", ResourceType = typeof(Caracal.Resources.GUI))] 
    public string NL { get; set; } 

    [DataType(DataType.MultilineText)] 
    [Display(Name = "english", ResourceType = typeof(Caracal.Resources.GUI))] 
    public string EN { get; set; } 

    [ScaffoldColumn(false)] 
    public string TranslatedText 
    { 
     get 
     { 
      return Util.Translate(NL, EN); 
     } 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (this is IOptional) 
     { 
      if (!string.IsNullOrEmpty(NL) && string.IsNullOrEmpty(EN)) 
       yield return new ValidationResult("EN is required if NL is entered."); 
       // TODO: Translate 

      if (!string.IsNullOrEmpty(EN) && string.IsNullOrEmpty(NL)) 
       yield return new ValidationResult("NL is required if EN is entered."); 
       // TODO: Translate 
     } 
     else 
     { 
      if (string.IsNullOrEmpty(NL)) 
       yield return new ValidationResult("NL is required"); 

      if (string.IsNullOrEmpty(EN)) 
       yield return new ValidationResult("EN is required"); 

     } 
    } 
} 

[ComplexType] 
public class TranslatedMultilineOptional : TranslatedMultiline, IOptional { } 

public interface IOptional {}