2012-02-21 12 views
5

मुझे हर जगह आधा समाधान मिलते हैं लेकिन मुझे इसके लिए वास्तविक जवाब नहीं मिल रहा है।एमवीसी 3 प्रमाणीकरण प्रमाणीकरण कॉन्टेक्स्ट.मेम्बरनाम शून्य है

मैं एक मान्यता विशेषता ValidationAttribute और IClientValidatable से इनहेरिट बनाया है।

सब कुछ ठीक काम करने के लिए लगता है, और त्रुटि प्रदर्शित करता है अगर मैं पृष्ठ पर एक मान्यता सारांश डाल दिया।

हालांकि मुझे संपत्ति से संबंधित टेक्स्टबॉक्स के बगल में त्रुटि प्रदर्शित नहीं हो रही है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे सत्यापन के परिणाम में संपत्ति का नाम जोड़ना होगा।

लेकिन इस जहां यह विफल रहता है, क्योंकि मैं validationContext से सदस्य नाम नहीं मिल सकता है।

ऐसा करने के लिए सक्षम करने का एक तरीका है? या क्या मैं कुछ न कुछ भूल रहा हूं?

public class AdmissionDayCaseAttribute : ValidationAttribute, IClientValidatable 
{ 
    private String DayCaseID; 
    private String AdmissionDateID; 
    private String DischargeDateID; 

    public AdmissionDayCaseAttribute(String DayCaseID, String AdmissionDateID, String DischargeDateID) 
    { 
     this.DayCaseID = DayCaseID; 
     this.AdmissionDateID = AdmissionDateID; 
     this.DischargeDateID = DischargeDateID; 
    } 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     object AdmissionDate = GetPropertyValue(validationContext.ObjectInstance, AdmissionDateID); 
     object DischargeDate = GetPropertyValue(validationContext.ObjectInstance, DischargeDateID); 
     object AdmissionType = validationContext.MemberName == null ? null : GetPropertyValue(validationContext.ObjectInstance, validationContext.MemberName); 
     if (AdmissionDate != null && DischargeDate != null && AdmissionType != null) 
     { 
      if (AdmissionDate.Equals(DischargeDate) && DayCaseID.Equals(AdmissionType.ToString())) 
      { 
       return new ValidationResult(ErrorMessage, new List<String>() { validationContext.MemberName }); 
      } 
     } 
     return ValidationResult.Success; 
    } 
    private object GetPropertyValue(object instance,String propertyName) 
    { 
     Type itype = instance.GetType(); 
     return itype.GetProperty(propertyName).GetValue(instance,null); 
    } 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     ModelClientValidationRule vr = new ModelClientValidationRule() 
     { 
      ErrorMessage = ErrorMessage, 
      ValidationType = "admissiondaycase" 
     }; 
     vr.ValidationParameters.Add(new KeyValuePair<string, object>("admissiondateid", AdmissionDateID)); 
     vr.ValidationParameters.Add(new KeyValuePair<string, object>("dischargedateid", DischargeDateID)); 
     vr.ValidationParameters.Add(new KeyValuePair<string, object>("daycaseid", DayCaseID)); 
     yield return vr; 
    } 

संपादित करें/अपडेट

दृश्य इस तरह दिखता है -

<tr> 
    <td> 
     @Html.LabelFor(x => x.AdmissionTypeID) 
    </td> 
    <td> 
     @Html.CustomDropDownListFor(a => a.AdmissionTypeID, Lookup.AdmissionTypes,Default.Constant.DROPDOWN) 
     @Html.ValidationMessageFor(a=>a.AdmissionTypeID) 
    </td> 
</tr> 

कोई जावास्क्रिप्ट या कुछ भी इस के साथ बातचीत, अपनी सुंदर बुनियादी लेकिन कुछ अतिरिक्त विवरण - इस दृश्य कोड एक दृश्य टेम्पलेट, जो

+0

क्या आप अपना विचार भी पोस्ट कर सकते हैं? क्या आपने अपने टेक्स्ट बॉक्स के अलावा @ Html.ValidationMessageFor (model => model.PropertyName) शामिल किया है? – CjCoax

+0

दृश्य जोड़ा गया है, यह निश्चित रूप से ध्यान में रखते हुए validtionmessagefor है - लेकिन सर्वर साइड MemberName अप –

उत्तर

7

पहले जांच कर लें कि +०१२३६९३६८७३६ एक आंशिक दृश्य में प्रयोग किया जाता है में हैआपके मॉडल की संपत्ति पर सही ढंग से निश्चित है।

तो बजाय validationContext.MemberName वापसी validationContext.DisplayName लौटने का

। यदि आपने सदस्य नाम को DsiplayAttribute के माध्यम से संशोधित किया है तो आप ऐसा कुछ कर सकते हैं:

var memberName = validationContext.ObjectType.GetProperties() 
    .Where(p => p.GetCustomAttributes(false) 
    .OfType<DisplayAttribute>() 
    .Any(a => a.Name == validationContext.DisplayName)) 
    .Select(p => p.Name).FirstOrDefault(); 

    return new ValidationResult(ErrorMessage, new List<String>() { memberName }); 
+0

प्रदर्शित नहीं करता है मैं समझ सकता कारण है कि मैं IValidatableObject का प्रयोग करेंगे, फिर भी मैं इसे वैध एक विशेष संपत्ति करना चाहते हैं, मॉडल ही नहीं । उपर्युक्त हालांकि उपयोगी है, सत्यापन से सदस्यनाम नहीं प्राप्त करने की मेरी देरी को ठीक नहीं करता है कॉन्टेक्स्ट –

+0

क्या सत्यापन कॉन्टेक्स्ट.डिस्प्लेनाम खाली है? –

+0

कोई प्रदर्शन नाम खाली नहीं है, हालांकि यह संपत्ति नाम के समान नहीं है (क्योंकि मैंने संपत्ति पर एक प्रदर्शन विशेषता भी घोषित की है) –

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