2008-12-15 17 views
6

में मॉडल चेतावनी मैं वर्तमान में सत्यापन त्रुटियों को पकड़ने और उपयोगकर्ता को वापस पास करने के लिए asp.net mvc में ModelStateDictionary का उपयोग कर रहा हूं। यह जांचने में सक्षम होना कि पूरा मॉडल ModelState.IsValid के साथ मान्य है या नहीं। हालांकि, मैं जिस मौजूदा एप्लिकेशन पर काम कर रहा हूं उसे चेतावनियों की रिपोर्ट करने में सक्षम होने की आवश्यकता है। ये महत्वपूर्ण नहीं हैं इसलिए फ़ॉर्म सामग्री अभी भी सहेजी जा सकती है, लेकिन उन्हें उपयोगकर्ता को दिखाया जाना चाहिए ताकि कार्रवाई को वैकल्पिक रूप से लिया जा सके।एएसपी.नेट एमवीसी

मैं यह देखने के लिए ढांचे के माध्यम से देख रहा हूं कि इसे करने के लिए मुझे अनुमति देने के लिए कोई स्पष्ट जगह है या नहीं। मैं सोच रहा हूं कि चेतावनी के साथ एक और शब्दकोश और मॉडल त्रुटि के उप-वर्ग को मॉडल चेतावनी कहा जाता है। मुझे यकीन नहीं है कि मैं दृश्य में अपने नए कंटेनर कक्षाओं का उपयोग करने के लिए ढांचा कैसे प्राप्त करूंगा। हालांकि, मैं अभी भी सभी मौजूदा त्रुटि सामग्री को काम करना चाहता हूं।

अगर किसी ने कुछ भी ऐसा करने की कोशिश की है या कोई विचार है तो मैं उनके इनपुट की सराहना करता हूं।

अद्यतन:

मैं जहाँ तक

public class AetherViewDataDictionary : ViewDataDictionary 
{ 
    public AetherViewDataDictionary() 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(object model) : base(model) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(ViewDataDictionary viewDataDictionary) : base(viewDataDictionary) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public ModelStateDictionary ModelStateWarning { get; private set; } 
} 

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

public partial class Index : ViewPage<PageViewData> 
{ 
    protected override void SetViewData(ViewDataDictionary viewData) 
    { 
     base.SetViewData(viewData); 
    } 
} 

यह इसे सही तरीके से सेट करता है, लेकिन जब मैं इस प्रकार की जांच करता हूं तो यह चला जाता है।

संपादित करें: यह चीजों को करने का एक गूंगा तरीका साबित हुआ, नीचे जवाब देखें।

उत्तर

6

तो मार्ग है कि मैं नीचे के नेतृत्व में था इससे पहले कि निकला एक बुरा विचार हो सकता है, वहाँ अभी नहीं ढांचा बिट्स कि आप की आवश्यकता पर प्राप्त करने के लिए पर्याप्त पहुँच है। कम से कम पहिया को कुछ बार पुनर्निर्मित किए बिना नहीं।

public class AetherModelState : ModelState 
{ 
    public AetherModelState() { } 

    public AetherModelState(ModelState state) 
    { 
     this.AttemptedValue = state.AttemptedValue; 

     foreach (var error in state.Errors) 
      this.Errors.Add(error); 
    } 

    private ModelErrorCollection _warnings = new ModelErrorCollection(); 

    public ModelErrorCollection Warnings { get { return this._warnings; } } 
} 

आदेश में आसानी से उसी तरह है कि आप मेरे द्वारा बनाए गए त्रुटियों होगा में चेतावनी जोड़ने के लिए सक्षम होने के लिए:

मैं इसे करने के लिए एक चेतावनी संकलन जोड़ा जाना ModelState वर्ग के विस्तार के मार्ग सिर नीचे करने का निर्णय लिया ModelStateDictionary के लिए कुछ विस्तार तरीके:

public static class ModelStateDictionaryExtensions 
{ 
    public static void AddModelWarning(this ModelStateDictionary msd, string key, Exception exception) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(exception); 
    } 

    public static void AddModelWarning(this ModelStateDictionary msd, string key, string errorMessage) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(errorMessage); 
    } 

    private static AetherModelState GetModelStateForKey(string key, ModelStateDictionary msd) 
    { 
     ModelState state; 
     if (string.IsNullOrEmpty(key)) 
      throw new ArgumentException("key"); 

     if (!msd.TryGetValue(key, out state)) 
     { 
      msd[key] = state = new AetherModelState(); 
     } 

     if (!(state is AetherModelState)) 
     { 
      msd.Remove(key); 
      msd[key] = state = new AetherModelState(state); 
     } 

     return state as AetherModelState; 
    } 

    public static bool HasWarnings(this ModelStateDictionary msd) 
    { 
     return msd.Values.Any<ModelState>(delegate(ModelState modelState) 
     { 
      var aState = modelState as AetherModelState; 
      if (aState == null) return true; 
      return (aState.Warnings.Count == 0); 
     }); 
    } 
} 

GetModelStateForKey कोड ropey है, लेकिन आप को देखने के लिए जहाँ मैं इस के साथ अध्यक्षता कर रहा हूँ सक्षम होना चाहिए। करने के लिए अगली बात कुछ विस्तार विधियों को लिखना है जो मुझे त्रुटियों के साथ चेतावनियों को प्रदर्शित करने की अनुमति देते हैं

+0

प्रयास क्या है? –

+0

इसके अलावा "अगर (एस्टेट == नल) सच हो जाता है;" लाइन गलत है। अगर हमें संबंधित संग्रह में कम से कम एक आइटम है तो हमें केवल सही लौटना चाहिए। तो आपको इस लाइन को हटा देना चाहिए और अगली पंक्ति को "वापसी (aState! = Null && aState.Warnings.Count> 0) में बदलना चाहिए;" –

4

व्यूडेटा में केवल चेतावनियों या शब्दकोश का एक सूची क्यों न जोड़ें, और फिर उन्हें अपने दृश्य में प्रदर्शित करें?

उदा।

ViewData[ "warnings" ] = new[] { "You need to snarfle your aardvark" } ; 
संबंधित मुद्दे